处理两个arraylists之间的差异

时间:2014-09-25 19:14:41

标签: java arraylist

我的问题是我要比较Java中的两个arraylists

e.g

String prop1 = "String"
String prop2 = "OtherString"
MyObject obj1 = new MyObject(prop1,prop2);
MyObject obj2 = new MyObject(prop1,prop2);
MyObject obj3= new MyObject(prop1,prop2);

ArrayList<MyObject> array1 = new Arraylist<>();
ArrayList<MyObject> array2 = new Arraylist<>();
//array 1 has 3 objects
array1.add(obj1);array1.add(obj2);array1.add(obj3);
//array 2 has 2 objects
array2.add(obj1);array2.add(obj2);

通过比较方法,我知道这些数组是不同的

(如果数组具有相同的元素,即使它们的顺序不同,我的方法返回false,如果它们具有相同的元素,则返回true)

因此,该方法将返回FALSE

我的问题是:

if(!methodToCompareArrays(array1,array2)){
    //HOW TO GET THE DIFFERENT objects (IN THIS CASE, obj3 is the different object)
    //this is the question :)
}else{
    //If there is no difference, well, it doesn't matter too much

请注意,我将在这些arraylists中拥有多个对象,并且方法效率也很重要(至关重要,但至少重要)。我已经看到了答案here但我不确定哪一个会更好或更差

提前致谢。

3 个答案:

答案 0 :(得分:1)

如果这些列表中的对象对您不重要,您可以执行以下操作:

array1.removeAll(数组2);

这将从array1中删除array2中存在的所有元素。

所以如果array1 = [obj1,obj2,obj3]和 array2 = [obj1,obj2]

removeAll:

之后

array1 = [obj3]和 array2 = [obj1,obj2]

如果您无法从任一列表中删除对象,请创建一个临时列表并从中删除以获取额外的对象。

答案 1 :(得分:1)

你应该使用java的set interfaces来实现这个目标。

现在,有一点重要的是在equals上使用一个好的MyObject方法来比较两个MyObjects是否相同。

然后你可以使用上面的文档链接来检查两组的交集。如果两个集合中的项目与一个集合中的项目数量相同,则它们是相同的集合(无论顺序如何)。

HashSet<MyObject> set1 = new HashSet<MyObject>(array1);
HashSet<MyObject> set2 = new HashSet<MyObject>(array2);

Set<MyObject> intersection = new HashSet<MyObject>(set1);
intersection.retainAll(set2);

if(intersection.size() == set2.size()) { 
    // They're the same.
} else { 
    HashSet<MyObject> itemsOnlyInSet1 = intersection;
    HashSet<MyObject> itemsOnlyInSet2 = set2.retainAll(set1);
} 

答案 2 :(得分:-2)

我不确定我的理解是什么,但如果您要对对象列表进行比较和排序,最好的选择是从Collections API中查找TreeMaps。试试这个:

Difference between HashMap, LinkedHashMap and TreeMap