3

嗨,我是 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>

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

 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 和ValuesList<String>.

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

例如:FieldNo=18 Values=["A"];

字段编号=18 值=[“B”]; 等等...

我使用的员工 ID 仅用于说明,覆盖等号和哈希码是有意义的。

4

7 回答 7

5

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

请注意,此方法会修改List您调用它的对象。如果您要保持原件List完整,则必须先复制列表,然后再复制副本上的方法。

例如

List<Employee> additionalDataInListA = new ArrayList<Employee>(listA);
additionalDataInListA.removeAll(listB);
于 2013-06-10T14:14:18.667 回答
3

覆盖equalsEmployee测试 id 之间的相等性(请记住,当您覆盖时,您equals也应该覆盖hashCode)。然后:

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

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

相关文件:

于 2013-06-10T14:14:10.463 回答
1

您可以使用 lambdaj(在此处下载网站)和 hamcrest(在此处下载网站),这些库对于管理集合非常强大,以下代码非常简单并且可以完美运行。使用这个库,您可以在一行中解决您的问题。您必须添加到您的项目: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 进行调整。

于 2013-06-10T18:01:32.873 回答
1

您可以使用此问题的最佳答案中所示的Collection接口方法(如何计算两个 ArrayLists 之间的差异?)removeAll

于 2013-06-10T14:14:01.820 回答
0
for(int j = 0; j < listB.size(); j++){
   if (!listA.contains(listB.get(j))
       additionalDataInListB.add(listB.get(j))
}

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

编辑:这只有在它们是同一个对象时才有效。情况可能并非如此。如果不是这种情况,您应该比较可能是 emp_id 的特征之一,看看它们是否相同。如果它们不相同,请将不同的添加到新列表中。

于 2013-06-10T14:11:45.920 回答
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>().

集合可以做集合操作,比如 removeAll 和retainAll

那将是最佳的(List 不是这种情况)。

于 2013-06-10T14:19:13.420 回答
0

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

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

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

源代码示例

于 2015-05-13T05:18:31.447 回答