在Java中比较两个ArrayList的元素

4

我有两个String类型的ArrayList,一个列表包含“book1”,“book2”,“book3”和“book4”。另一个ArrayList包含“book1”,“book2”和“book3”。因此,第一个列表的大小为4,第二个列表的大小为3。我创建了另一个ArrayList,其大小等于第一个列表的大小。

List<Integer> comparingList = new ArrayList<Integer>();
                    //adding default values as one
                    for(int a=0;a<firstList.size();a++){
                        comparingList.add(0);

                    }

如果两个列表之间的任何内容相等,我将设置1而不是0。

因此新的arrayList(comparingList)应该有1,1,1,0个元素。

for(int counter = 0;counter < firstList.size();counter++){
for(int counter1 = 0;counter1 < secondList.size();counter1++){
if(firstList.get(counter).equals(secondList.get(counter1))){
    comparingList.set(counter,1);
    break;
}
}

}

但是当我这样做时,由于无法进入if条件语句,我无法将1设置为变量的值。请问有人能帮忙吗?


你认为出了什么问题? - Alan Stokes
1
尝试在循环内打印值,以查看您正在比较哪些值。 - Aakash
请参考:https://dev59.com/PWUp5IYBdhLWcg3wkITF#15184473 - Amir Kost
@Alan Stokes 我觉得我无法进入那个if条件...似乎.equals不起作用。 - SunJCarkeY
@sunjcarkey 看起来 Integer equals() 函数出了问题的可能性不大。请尝试进行调试。 - Alan Stokes
@Alan Stokes..我也试过了..它不会进入if条件语句之内.. - SunJCarkeY
2个回答

6

只迭代长度较大的第一个arraylist,并在第二个arraylist中检查contains,如果找到则设置为1,否则不做任何操作。

for(int counter = 0; counter < firstList.size(); counter++) {
    if(secondList.contains(firstList.get(counter))) {
          comparingList.set(counter,1);
      }
  }

整个Java程序

只需尝试在http://www.compileonline.com/compile_java_online.php中运行以下程序。

import java.util.ArrayList;
import java.util.List;

public class CompareArrayListTest{

 public static void main(String[] args) {

    ArrayList<String> firstList = new ArrayList<String>();

    firstList.add("book1");
    firstList.add("book2");
    firstList.add("book3");
    firstList.add("book4");

    ArrayList<String> secondList = new ArrayList<String>();

    secondList.add("book1");
    secondList.add("book2");
    secondList.add("book3");

    List<Integer> comparingList = new ArrayList<Integer>();
    // adding default values as one
    for (int a = 0; a < firstList.size(); a++) {
        comparingList.add(0);

    }

    for (int counter = 0; counter < firstList.size(); counter++) {
        if (secondList.contains(firstList.get(counter))) {
            comparingList.set(counter, 1);
        }
    }

    System.out.println(comparingList);

}

BitSet bitset = new BitSet();
// adding default values as one
for (int a = 0; a < firstList.size(); a++) {
    comparingList.add(0);

}

for (int counter = 0; counter < firstList.size(); counter++) {
    for (int counter2 = 0; counter < secondList.size(); counter++) {
        if (secondList.get(counter2).equals(firstList.get(counter))) {
            bitset.set(counter, 1);
        }
    }
}

@sunjcarkey 条件是好的,我已经粘贴了整个程序并使用相同的条件,在您喜欢的Java编辑器或在线网站http://www.compileonline.com/compile_java_online.php上检查它。 - Santosh Joshi
它与您想的有些不同...因为如果firstList中的book2和secondList中的books2相等,则会在第三个列表的第二个索引中设置1。因此,这意味着我需要知道firstList中book2的索引。 - SunJCarkeY
@sunjcarkey,那么你的问题可能不够清晰,你从未提到你想要保留顺序。 - Santosh Joshi
所以,现在不再使用新的Arraylist来存储可用和不可用元素的0和1。请尝试使用BitSet来设置相应的位。已在帖子上方添加了代码。 - Santosh Joshi
@sunjcarkey,很奇怪,可能是编辑器的问题。你可以尝试在http://www.compileonline.com/compile_java_online.php上运行你的示例代码,这可能有助于你了解问题是否出在你的编辑器上。 - Santosh Joshi
显示剩余2条评论

2

您可以将列表转换为集合,然后使用Set.retainAll方法对不同的集合进行交集操作。一旦您对所有集合求交集,您就会得到共同的元素,并且您可以将结果集合转换回列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接