it-swarm-ru.tech

Сравните каждый элемент с любым другим элементом в ArrayList

У меня проблемы с тем, что я думал, должно быть довольно простой проблемой.

Мне нужно сравнить каждый элемент в arrayList с каждым другим элементом в списке, не сравнивая элементы с самим собой. Это не так просто, как вызывать сравнение equals (), оно включает в себя некоторую пользовательскую логику, которую я опустил в своем коде ниже. Также ArrayList не должен быть изменен в любом случае. 

Мне кажется, что проблема в том, что, как только я попадаю во второй цикл, я не знаю, есть ли у меня другой объект для сравнения (так как это список переменного размера).

for(int i =0; i< list.size(); i++){ 
    //get first object to compare to
    String a = list.get(i).getA();

    Iterator itr = list.listIterator(i + 1 ); // I don't know if i + 1 is valid
    while(itr.hasNext()){
        // compare A to all remaining items on list
    }
}

Я думаю, что я, вероятно, иду по этому пути неправильно, я открыт для предложений или советов о том, как сделать это лучше. 

16
JavaKungFu
for (int i = 0; i < list.size(); i++) {
  for (int j = i+1; j < list.size(); j++) {
    // compare list.get(i) and list.get(j)
  }
}
34
Kaleb Brasee

В чем проблема с использованием цикла for внутри, как снаружи?

for (int j = i + 1; j < list.size(); ++j) {
    ...
}

В общем, начиная с Java 5, я использовал итераторы только один или два раза.

2
Nikita Rybak

В некоторых случаях это лучший способ, потому что ваш код может что-то изменить, и j = i + 1 не будет проверять это.

for (int i = 0; i < list.size(); i++{   
    for (int j = 0; j < list.size(); j++) {
                if(i == j) {
                    continue;
                }

}
1
Piotr Jankowski

Следующий код будет сравнивать каждый элемент с другим списком элементов, используя метод contains (). Длина цикла for должна быть больше (), чем размер большего списка, тогда он будет сравнивать только значения обоих списков.

List<String> str = new ArrayList<String>();
str.add("first");
str.add("second");
str.add("third");
List<String> str1 = new ArrayList<String>();
str1.add("first");
str1.add("second");
str1.add("third1");
for (int i = 0; i<str1.size(); i++)
{
System.out.println(str.contains(str1.get(i)));
}

Вывод true True False

0
Karthick

Этот код помог мне получить такое поведение: со списком a, b, c я должен сравнивать ab, ac и bc, но любая другая пара будет избыточной/ненужной.

import Java.util.*;
import static Java.lang.System.out;

// rl = rawList; lr = listReversed
ArrayList<String> rl = new ArrayList<String>();
ArrayList<String> lr = new ArrayList<String>();
rl.add("a");
rl.add("b");
rl.add("c");
rl.add("d");
rl.add("e");
rl.add("f");

lr.addAll(rl);
Collections.reverse(lr);

for (String itemA : rl) {
    lr.remove(lr.size()-1);
        for (String itemZ : lr) {
        System.out.println(itemA + itemZ);
    }
}

Цикл выглядит так, как показано на рисунке: Визуальный пример треугольного сравнения

или как это:

   |   f    e    d    c    b   a
   ------------------------------
a  |  af   ae   ad   ac   ab   ·
b  |  bf   be   bd   bc   ·   
c  |  cf   ce   cd   ·      
d  |  df   de   ·         
e  |  ef   ·            
f  |  ·               

общее сравнение представляет собой треугольное число (n * n-1)/2

0
BrnLng