Java-比较两个字符串列表(如果它们具有公共值)并返回多少项相同

Java-比较两个字符串列表(如果它们具有公共值)并返回多少项相同,java,arraylist,Java,Arraylist,我想比较两个列表,看看它们是否有共同点 范例 List<String> list1 = new ArrayList(); list1.add("id1"); list1.add("id2"); list1.add("id3"); list1.add("id10"); List<String> list2 = new ArrayList(); list2.add("id10"); list2.add("id20"); list2.add("id3"); list2.add

我想比较两个列表,看看它们是否有共同点

范例

List<String> list1 = new ArrayList();
list1.add("id1");
list1.add("id2");
list1.add("id3");
list1.add("id10");

List<String> list2 = new ArrayList();
list2.add("id10");
list2.add("id20");
list2.add("id3");
list2.add("id30");
list2.add("id31");
List list1=new ArrayList();
清单1.添加(“id1”);
清单1.添加(“id2”);
清单1.添加(“id3”);
清单1.添加(“id10”);
List list2=新的ArrayList();
清单2.添加(“id10”);
清单2.添加(“id20”);
清单2.添加(“id3”);
清单2.添加(“id30”);
清单2.添加(“id31”);

并返回在最短和最佳的过程中有多少项具有相同的值。

一种方法是,将两个列表中的元素放入一个
集合
,检查
集合.size()
是否与
列表1.size()+列表2.size()相同

差异将是重复元素的计数。

尝试以下方法:

ArrayList intersection = new ArrayList<>(list1);
intersection.retainAll(list2);
ArrayList交叉点=新的ArrayList(列表1);
交叉口。保留(列表2);

交叉点将包含公共元素

我不知道这是否是最有效的方法,但我会这样做:

public static int getCommonValues() {
    int values = 0;
    if(list1 != null && list2 != null) {
        Iterator it = list1.iterator();

        while(it.hasNext()) {
            String value = it.next();

            Iterator it2 = list2.iterator();
            while(it2.hasNext()) {
                String value2 = it2.next();

                if(value2 == value) {
                    values = values + 1;
                    break;
                }
            }
        }
    }
    return values;
}
使用以下代码:

    Set<String> set =  new HashSet<>(list1);
    set.addAll(list2);
    System.out.println(((list1.size() + list2.size()) - set.size()));
Set Set=newhashset(列表1);
set.addAll(列表2);
System.out.println(((list1.size()+list2.size())-set.size());

retainAll不允许空元素。而且它比创建hashMap慢。OP问“最短和最优的过程”,对我来说,这似乎是短而好的。这个问题明智地没有要求“快”。公平地说,我们对优化的理解不尽相同。在这种情况下,我们有一个优化的方法。我从一开始就使用hashSet,然后我可以使用std方法。她在O(1)中搜索一些东西,但在我看来,不可能找到更好的,他会发现类似O的东西(list1.size()+list2.size())我不熟悉Set,你能举个完整的例子吗?另外,对于这个O(1),我可以获得什么访问时间?请阅读java文档
Set
。它不是
O(1)
btw,在内部,java(Set.addAll()
方法)创建了一个hashmap,并将所有元素放在其中。他们说,首先,当将元素放在集合中时,是O(n)访问时间,然后,使用集合执行的任何操作都是O(1)是真的吗?@archeemiya如果你说任何操作,我不知道你这是什么意思。Hashtable/map有O(1)用于添加/删除/包含操作。一个错误的写入哈希集是O(1)作为包含、删除和大小,但获得交叉点将是O(n)我对此的访问时间是多少,O(n)?你的n是多少?@ArcherEmiya这个答案实际上是我答案的代码实现。如果您正在寻找解决方案,则您的问题没有
O(1)
解决方案。@ArnaultLePrévost Corvellec n=列表中的项目数