Сравните каждый элемент с любым другим элементом в ArrayList - PullRequest
16 голосов
/ 14 февраля 2011

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

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

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

Ответы [ 5 ]

35 голосов
/ 14 февраля 2011
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 голосов
/ 14 февраля 2011

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

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

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

1 голос
/ 11 января 2016

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

0 голосов
/ 23 ноября 2016

Этот код помог мне понять следующее: со списком 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 голосов
/ 06 января 2016

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

...