我想比较两个数组列表内容。
我以这种方式在其中存储对象。
对于数组列表 1:
Employee e1=new Employee();
e1.setID("1");
e1.setID("2");
ArrayList<Employee>list1 = new ArrayList<Employee>();
if(e1!=null){
list1.add(e1);
}
对于数组列表 2:
Employee e2=new Employee();
e2.setID("1");
e2.setID("2");
e2.setID("4");
ArrayList<Employee>list2 = new ArrayList<Employee>();
if(e2!=null){
list2.add(e2);
}
现在我尝试以这种方式比较上面的数组列表内容
ArrayList<Employee>unmatchedList = new ArrayList<Employee>();
for (Employee l1 : list1){
if(!list2.contains(l1.getID())){
System.out.println("list2 does not contains this ID"+l1.getID());
Employee e3=new Employee();
e3.setID(l1.getID());
if(unmatchedList==null){
unmatchedList=new ArrayList<Employee>();
unmatchedList.add(e3);
}
if(unmatchedList!=null){
unmatchedList.add(e3);
}
}
}
但我没有得到正确的不匹配列表内容作为"4"仅.我得到不匹配的列表作为"1"和"2"这是错误的。那么我怎样才能只在"unmatchedList"<</p>
如果你的类Employee
是这样定义的:
public class Employee {
private int id;
public Employee(int id){
this.id = id;
}
public int getId() {
return id;
}
@Override
public String toString() {
return "Id : " + this.id;
}
@Override
public boolean equals(Object obj) {
return (obj instanceof Employee) && this.id == ((Employee)obj).getId();
}
在 Main 方法中,您可以像这样检索不匹配的内容:
public static void main( String[] args )
{
List<Employee> l1 = new ArrayList<Employee>();
l1.add(new Employee(1));
l1.add(new Employee(2));
l1.add(new Employee(3));
l1.add(new Employee(4));
l1.add(new Employee(5));
List<Employee> l2 = new ArrayList<Employee>();
l2.add(new Employee(4));
l2.add(new Employee(5));
l1.removeAll(l2);
System.out.println(l1);
}
这将打印:[Id : 1, Id : 2, Id : 3]
请注意,对于此工作,必须重写 equals
方法。
问题是这段代码: -
if(!list2.contains(l1.getID())){
您的list2
是ArrayList<Employee>
,并且您正在检查l1.getId()
是否包含。因此,您的if
条件将永远正确。
您应该在Employee
类中重写equals
和hashCode
方法,而只使用:-
if(!list2.contains(l1))
用于检查 list2 是否包含员工l1
。
以及为什么要在将id
添加到列表之前连续设置 3 次。它不会添加所有三个 id,而只会添加一个为 id 设置最后一个值的Employee
。您需要更正它: -
e2.setID("1");
e2.setID("2");
e2.setID("4");
list.add(e2); // Will only add one Employee with id = 4
为您的员工添加一个 equals
方法,通过他们的 ID 比较他们,复制list2
并调用 removeAll
:
List<Employee> list1 = ...;
List<Employee> list2 = ...;
List<Employee> unmatchedList = new ArrayList<Employee>(list2);
unmatchedList.removeAll(list1);
有关完整示例,请参阅 @Dimitri 的答案。
我认为您应该将Set
用于您的场景。也许这个例子会对你有所帮助。
Employee
类
package com.yourcomp;
/**
* <br>
* <div style="width:600px;text-align:justify;">
*
* TODO: Class comment.
*
* </div>
* <br>
*
*/
public class Employee {
private int id;
/**
* Constructor for Employee. <tt></tt>
*/
public Employee() {
this(-1);
}
/**
* Constructor for Employee. <tt></tt>
*/
public Employee(int id) {
this.id = id;
}
/**
* Gets the id.
*
* @return <tt> the id.</tt>
*/
public int getId() {
return id;
}
/**
* Sets the id.
*
* @param id <tt> the id to set.</tt>
*/
public void setId(int id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
return this.id == ((Employee)obj).id;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Employee [id=" + id + "]";
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
// TODO Auto-generated method stub
return new Integer(id).hashCode();
}
}
TestEmployee
类:
package com.yourcomp;
import java.util.HashSet;
import java.util.Set;
/**
* <br>
* <div style="width:600px;text-align:justify;">
*
* TODO: Class comment.
*
* </div>
* <br>
*
*/
public class TestEmployee {
public static void main(String[] args) {
// creating the first set with employees having ID's 1 to 5
Set<Employee> set1 = new HashSet<Employee>();
for(int i=1;i<5;i++)
set1.add(new Employee(i));
System.out.println(set1); // printing it
// creating the first set with employees having ID's 3 to 8.
// note that now you have two employees with same ID, 3 & 4
Set<Employee> set2 = new HashSet<Employee>();
for(int i=3;i<8;i++)
set2.add(new Employee(i));
System.out.println(set2);// printing the second set
// creates a final set to contain all elements from above two sets without duplicates
Set<Employee> finalSet = new HashSet<Employee>();
for(Employee employee:set1)
finalSet.add(employee); // adds first set content
for(Employee employee:set2)
finalSet.add(employee); // adds second set content. If any duplicates found, it will be overwritten
System.out.println(finalSet); // prints the final set
}
}
和输出
[Employee [id=1], Employee [id=2], Employee [id=3], Employee [id=4]]
[Employee [id=3], Employee [id=4], Employee [id=5], Employee [id=6], Employee [id=7]]
[Employee [id=1], Employee [id=2], Employee [id=3], Employee [id=4], Employee [id=5], Employee [id=6], Employee [id=7]]
我也会推荐一个 Set 来做差异,如果你可以使用 Sets,那么我会使用 Guava-Set 的差分方法:http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Sets.html#difference%28java.util.Set,%20java.util.Set%29