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=列表中的项目数