我有两个清单
List<Person> person = new ArrayList<Person>();
List<Employee> employee = new Arraylist<Employee>();
和另一个人员类型列表
List<Person> temp_person = new ArrayList<Person>();
这两个列表不同,但有一个共同的“密钥”是“id”。
现在,我想检查person
的“id”是否与employee
的“id”相同。如果我找到任何匹配项,请将person
的元素添加到temp_person
答案 0 :(得分:2)
这里的想法很简单:对于person
中包含的所有元素,请检查值p.id
是否与e.id
中包含的所有元素的employee
匹配,以及将它们收集到新列表temp_person
。
如果你不能保证两个实体之间的任何关系,那么这里的结果将是双嵌套循环或O(nk)效率。
在Java 8中,使用Stream API读取的内容会稍微减少。它采用我上面描述的并使其可执行。
final List<Person> temp_person =
person.stream()
.filter(p -> employee.stream().anyMatch(e -> e.getId() == p.getId()))
.collect(Collectors.toList());
答案 1 :(得分:1)
你必须在person
列表上为循环创建两个for循环,并在employee
列表上循环并检查是否有任何匹配(id&#39; s相等)然后将该元素添加到temp_person
列表
循环中的break
以打破该循环并启动另一个循环(因为您已经找到匹配所以需要获取另一个元素)
假设您可以通过id
获取getId()
,如果ID不是int,则ID为int且String
使用equals()
for(int i = 0 ; i < person.size() ; i++){
for(int j = 0 ; j < employee.size() ; j++){
if(person.get(i).getId()==employee.get(j).getId()){
temp_person.add(person.get(i));
break;
}
}
}
答案 2 :(得分:1)
你的元素很少,你不必过多担心性能。但是为了争论,对于大型列表来说,更有效的方法如下:通过id将人和empoyees放在地图中(或者更好地保持他们像这样)。在personById.keySet()和employee.keySet()之间进行交集,最后迭代生成的密钥集,从人员地图中提取并放入临时列表。
假设地图是这样维护的并且不必计算,这将是keySets的O(1),交叉点将在O(k)(Guavas)和复制循环中运行时间相对于匹配数,最差情况为O(k),其中每个副本为O(1)(摊销)。所以你最终得到O(k)时间复杂度。
答案 3 :(得分:-1)
It can be done in this manner as below :
List<Person> temp_person = new ArrayList<Person>();
Iterator<Person> firstIterator = firstArrayList.iterator();
while (firstIterator.hasNext()) {
String str1 = (String) firstIterator.next().ID();
Iterator<Employee> secondIterator = secondListArrayList.iterator();
while (secondIterator.hasNext()) {
String str2 = (String) secondIterator.next().ID();
if (str1.equals(str2)) {
temp_person.add(firstIterator.next());
}
}
}