我有两个arraylist,定义如下。
ArrayList<String> list1 = new arrayList<String>();
ArrayList<String> list2 = new arrayList<String>();
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;
}
但我的代码非常低效。你能告诉我一个更好的方法来达到我的目的吗?
答案 0 :(得分:3)
而不是List
,您应该使用Set
。那你要找的是Symmetric Difference。如果允许,您可以使用Guava的Sets.symmetricDifference(Set, Set)
答案 1 :(得分:3)
您可以使用CollectionUtils.disjunction(来自Apache Commons Lib),然后在返回的集合上执行size()
。
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
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);
答案 2 :(得分:1)
首先,您可以按以下方式初始化列表:
List<String> 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();
如果您不想更改阵列,可以按照以下步骤进行复制:
Collections.copy(newArray, oldArray);