用于确定两个arraylist中不同项目的代码

我有两个arraylist,定义如下。

ArrayList list1 = new arrayList(); ArrayList list2 = new arrayList(); list1.add("sultan"); list1.add("Masum"); list1.add("sultan"); list1.add("Sorry"); list1.add("sultan"); list1.add("Masum"); list1.add("sultan"); list1.add("Tarek"); list1.add("sultan"); list2.add("Billal"); list2.add("Masum"); list2.add("Sorry"); list2.add("Sorry"); list2.add("sultan"); list2.add("Masum"); list2.add("Tanha"); list2.add("Tarek"); list2.add("Die"); 

我想知道上面两个arraylist中不同的项目。 为此,我有以下一段代码。

 int count=0; for(String s1:list1) { if(!list2.contains(s1)) ++count; } for(String s2:list2) { if(!list1.contains(s2)) ++count; } 

但是我的代码非常低效。 你能告诉我一个更好的方法来实现我的目的吗?

您应该使用Set而不是List 。 那么你要找的是对称差异 。 如果允许,您可以使用Guava的Sets.symmetricDifference(Set, Set)

您可以使用CollectionUtils.disjunction (来自Apache Commons Lib),然后对返回的Collection执行size()

  List list1 = new ArrayList(); List list2 = new ArrayList(); list1.add("sultan"); list1.add("Masum"); list1.add("sultan"); list1.add("Sorry"); list1.add("sultan"); list1.add("Masum"); list1.add("sultan"); list1.add("Tarek"); list1.add("sultan"); list2.add("Billal"); list2.add("Masum"); list2.add("Sorry"); list2.add("Sorry"); list2.add("sultan"); list2.add("Masum"); list2.add("Tanha"); list2.add("Tarek"); list2.add("Die"); int numOfDiffs = CollectionUtils.disjunction(list1, list2).size(); System.out.println("Diffs: " + numOfDiffs); 

首先,您可以按以下方式初始化列表:

 List list1 = new ArrayList<>(Arrays.asList(new String[]{"sultan", "Masum", "others..."})); 

然后你可以计算他们有多少共同元素,并从总数中删除这个数字:

 int list1 oldSize = list1.size(); list1.retainAll(list2); // In list1 you get common elements 

 count = oldSize - list1.size(); 

如果您不想更改arrays,可以按如下方式复制它们:

 Collections.copy(newArray, oldArray);