用于确定两个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);