Java比较和添加项目到列表

时间:2015-11-04 05:49:16

标签: java list arraylist

我有两个清单

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

4 个答案:

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