将每个项目与ArrayList中的每个其他项目进行比较

时间:2011-02-14 15:35:29

标签: java algorithm sorting arraylist compare

我遇到的问题应该是一个非常简单的问题。

我需要将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
    }
}

我想我可能会以错误的方式解决这个问题,我愿意接受有关如何做得更好的建议或提示。

6 个答案:

答案 0 :(得分:35)

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

答案 1 :(得分:2)

在内部使用for循环有什么问题?就像在外面一样?

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

通常,从Java 5开始,我只使用了一次或两次迭代器。

答案 2 :(得分:1)

在某些情况下,这是最好的方法,因为你的代码可能会改变一些东西而j = i + 1不会检查它。

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

}

答案 3 :(得分:0)

以下代码将使用contains()方法将每个项目与其他项目列表进行比较.for循环的长度必须是较大列表的较大size(),然后才会比较两个列表的所有值。

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

输出为真 真正 假

答案 4 :(得分:0)

这段代码帮助我解决了这个问题:使用列表a,b,c,我应该比较ab,ac和bc,但是任何其他对都会超出/不需要。

b

循环如下图所示: Triangular comparison visual example

或者这样:

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

总比较是三角数(n * n-1)/ 2

答案 5 :(得分:0)

你可以这样做。

for (int i = 0; i < arrayList.size(); i++) {
    for (int j = 0; j < arrayList.size(); j++) {
        if (i!=j &&  arrayList.get(i).YourObjectItem().equals(arrayList.get(j).YourObjectItem())) {
            //Your code will be here
        }

    }
}