在java中查找arraylist中的Missing项

时间:2013-06-10 14:08:56

标签: java arraylist difference

您好我是java的新手,正在尝试我的手上的集合部分,我有一个简单的查询 我有两个说员工对象的数组列表

class Employee
{
    private int emp_id;
    private String name;
    private List<String> mobile_numbers;

    //.....getters and setters
}

listAlistB有以下数据

    List<Employee> listA = new ArrayList<Employee>(); 
    List<Employee> listB = new ArrayList<Employee>(); 

    listA.add(new Employee("101", "E1", listOfMobileNumbers));
    listA.add(new Employee("102", "E2", listOfMobileNumbers1));
    listA.add(new Employee("103", "E3", listOfMobileNumbers2));
    listA.add(new Employee("104", "E4", listOfMobileNumber4));
    listA.add(new Employee("105", "E5", listOfMobileNumbers5));

    listB.add(new Employee("101", "E1", listOfMobileNumbers1));
    listB.add(new Employee("102", "E2", listOfMobileNumbers2));
    listB.add(new Employee("106", "E6", listOfMobileNumber6));
    listB.add(new Employee("107", "E7", listOfMobileNumber7));
    listB.add(new Employee("108", "E8", listOfMobileNumbers8));

其中listOfMobileNumbersList<String>

现在我想从个人列表中找到其他元素。 即

 List<Employee> additionalDataInListA = new ArrayList<Employee>(); 
    // this list should contain 103, 104 and 105

  List<Employee> additionalDataInListB= new ArrayList<Employee>(); 
    // this list should contain 106, 107 and 108               

我如何实现这一目标?

感谢您的帮助。

编辑:

我不想使用任何内部函数我想实现它编写一些手动函数类比较函数。

我也无法覆盖equals函数,因为在我的用例中我有 FieldNo ,这是int和,这是List<String>

字段的出现次数为'n'次,每次与该字段关联的值都不同。

例如: FieldNo = 18 值= [ “A”];

FieldNo = 18 值= [ “B”]; 等......

我使用的员工ID仅用于说明覆盖equals和hash代码的意义。

7 个答案:

答案 0 :(得分:4)

您可以使用boolean removeAll(Collection<?> c)方法。

请注意,此方法会修改您调用它的List。如果您保持原始List完整,那么您必须先复制列表,然后复制该方法。

e.g。

List<Employee> additionalDataInListA = new ArrayList<Employee>(listA);
additionalDataInListA.removeAll(listB);

答案 1 :(得分:3)

覆盖equals中的Employee以测试ID之间的相等性(请记住,当您覆盖equals时,您还应覆盖hashCode)。然后:

List<Employee> additionalDataInListA = new ArrayList<Employee>(listA);
additionalDataInListA.removeAll(listB);

List<Employee> additionalDataInListB = new ArrayList<Employee>(listB);
additionalDataInListB.removeAll(listA);

相关文档:

答案 2 :(得分:1)

您可以使用Collection界面的removeAll方法,如this question (How can I calculate the difference between two ArrayLists?)的首字母答案所示。

答案 3 :(得分:1)

你可以使用lambdaj(download herewebsite)和hamcrest(download herewebsite),这个库非常强大,可用于管理集合,下面的代码非常简单而且完美。使用此库,您可以在一行中解决您的问题。你必须添加到你的项目:hamcrest-all-1.3.jar和lambdaj-2.4.jar希望这有助于服务。

import static ch.lambdaj.Lambda.filter;
import static ch.lambdaj.Lambda.having;
import static ch.lambdaj.Lambda.on;
import java.util.Arrays;
import java.util.List;
import static org.hamcrest.Matchers.isIn;
import static org.hamcrest.Matchers.not;

public class Test2{
        public static void main(String[] args) {
            List<String> oldNames =  Arrays.asList("101","102","103","104","105");
            List<String> newNames = Arrays.asList("101","102","106","107","108");

            List<String> newList = filter(not(having(on(String.class), isIn(oldNames))),newNames);
            List<String> newList2 = filter(not(having(on(String.class), isIn(newNames))),oldNames);
            System.out.println(newList);
            System.out.println(newList2);
            /*out
            [106, 107, 108]
            [103, 104, 105]
            */
    }
}

此示例使用简单的字符串列表,但可以适用于您的对象Employee。

答案 4 :(得分:0)

class Employee {
    private int empId;
    ...
    @Override
    public int hashCode() { return empId; }

    @Override
    public boolean equals(Object other) {
        return other != null && other instanceof Employee && other.empId == empId;
    }
}

以上内容可让您制作Set<Employee> employees = new HashSet<Employee>()

集可以执行set操作,例如removeAll和retainAll

这将是最佳的(对于List来说不是这种情况)。

答案 5 :(得分:0)

它非常简单,首先迭代数组并获得所有数字的总和,因为我们知道从1到n的自然数之和,我们可以写成n *(n + 1)/ 2。现在我们必须从[n *(n + 1)/ 2]中减去数组的总和。

这里我们得到了缺失的数字。

你可以在你的代码中实现这个逻辑,我希望你明白我的观点。

Source with example

答案 6 :(得分:-1)

for(int j = 0; j < listB.size(); j++){
   if (!listA.contains(listB.get(j))
       additionalDataInListB.add(listB.get(j))
}

只需重复相反的值即可填充additionalDataInListA对象。这应该可以解决问题:)

编辑:仅当这些是同一个对象时才会起作用。情况可能并非如此。如果不是这种情况,您应该比较其中一个特征可能是emp_id,看看它们是否相同。如果它们不相同,请将不同的一个添加到新列表中。