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

时间:2014-02-07 15:40:24

标签: java arraylist

我有两个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;
}

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

3 个答案:

答案 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);