您好我是java的新手,正在尝试我的手上的集合部分,我有一个简单的查询 我有两个说员工对象的数组列表
class Employee
{
private int emp_id;
private String name;
private List<String> mobile_numbers;
//.....getters and setters
}
说listA
和listB
有以下数据
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));
其中listOfMobileNumbers
是List<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代码的意义。
答案 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 here,website)和hamcrest(download here,website),这个库非常强大,可用于管理集合,下面的代码非常简单而且完美。使用此库,您可以在一行中解决您的问题。你必须添加到你的项目: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]中减去数组的总和。
这里我们得到了缺失的数字。
你可以在你的代码中实现这个逻辑,我希望你明白我的观点。
答案 6 :(得分:-1)
for(int j = 0; j < listB.size(); j++){
if (!listA.contains(listB.get(j))
additionalDataInListB.add(listB.get(j))
}
只需重复相反的值即可填充additionalDataInListA对象。这应该可以解决问题:)
编辑:仅当这些是同一个对象时才会起作用。情况可能并非如此。如果不是这种情况,您应该比较其中一个特征可能是emp_id,看看它们是否相同。如果它们不相同,请将不同的一个添加到新列表中。