Сравните каждый элемент с любым другим элементом в 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
    }
}

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

Ответ 1

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)
  }
}

Ответ 2

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

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

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

Ответ 3

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

for (int i = 0; i < list.size(); i++){  
    for (int j = 0; j < list.size(); j++) {
                if(i == j) {
               //to do code here
                    continue;
                }

}

}

Ответ 4

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

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 правда ложь

Ответ 5

Этот код помог мне получить такое поведение: со списком 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