Java 处理两个ArrayList之间的差异

Java 处理两个ArrayList之间的差异,java,arraylist,Java,Arraylist,我的问题是,我将比较Java中的两个ArrayList e、 g 请注意,我将在这些ArrayList中包含多个对象,而且方法效率也很重要(不是很重要,但至少很重要)。我已经看到了答案,但我不确定哪一个更好或最坏 提前感谢。如果这些列表中的对象对您不重要,您可以执行以下操作: 阵列1.移除所有(阵列2) 这将从array1中删除array2中存在的所有元素 所以如果array1=[obj1,obj2,obj3]和 阵列2=[obj1,obj2] 移除所有后: 阵列1=[obj3]和 阵列2=[o

我的问题是,我将比较Java中的两个ArrayList

e、 g

请注意,我将在这些ArrayList中包含多个对象,而且方法效率也很重要(不是很重要,但至少很重要)。我已经看到了答案,但我不确定哪一个更好或最坏


提前感谢。

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

阵列1.移除所有(阵列2)

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

所以如果array1=[obj1,obj2,obj3]和 阵列2=[obj1,obj2]

移除所有后:

阵列1=[obj3]和 阵列2=[obj1,obj2]


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

您可能应该使用java来实现此目的

现在,一件重要的事情是在
MyObject
上有一个好的
equals
方法来比较两个
MyObject
是否相同

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

HashSet set1=新的HashSet(array1);
HashSet set2=新的HashSet(array2);
集合交集=新哈希集合(集合1);
交叉口。保留(set2);
如果(intersection.size()==set2.size()){
//他们是一样的。
}否则{
HashSet itemsOnlyInSet1=交集;
HashSet itemsOnlyInSet2=set2.retainal(set1);
} 

我不确定我是否理解您的问题,但如果您试图对对象列表进行比较和排序,最好的选择是从Collections API中查找树状图。试试这个:


难道
methodToCompareArrays
至少已经为您做了一些这样的事情吗?在我看来,对称性差异就是您正在寻找的。。。查看Apache Commons CollectionUtil
析取
函数它首先比较ArrayList大小,因此在本例中返回false。我的方法是基于DiddiZ的答案,答案应该是什么(array1,array2),还是应该是什么(array2,array1)?两个集合中可以有不同的对象(即一个集合中存在的对象不在另一个集合中);在这种情况下,你到底在寻找什么?在这两种情况下,答案都应该是“object3”,而且可能是肯定的(一个数组中存在的对象不在另一个数组中),但更有可能是一个数组包含所有对象,而另一个数组包含除三个或五个之外的所有对象。我在OP的帖子中没有看到任何关于排序的参考,与简单的元素集合相反,任何需要地图的东西……我从来没有说过有“排序”的提法。请再读一遍我写的东西。我猜,因为他想比较一个对象列表,所以他可能有兴趣对它们进行排序。我想在我的帖子里没有任何东西可以否决它。而且,他似乎有两个字段“prop1”和“prop2”。如果他通过比较这些字段中的一个来实现他的比较方法,那么他还可以查看使用键值对的映射。然后他可以使用他的比较字段作为地图中的键。如果OP已经有了ArrayList,我不确定仅仅为了进行比较就从每个列表创建集合是否值得。如果有很多项目(数千?数万或数十万?我不确定),那是值得的,但这听起来不像是基于OP描述的比例……如果我应该用“MyObject”替换“Type”,我不太理解(也许这个评论是noobish)@蒂姆:好吧,我不希望有几千个,也许是一百个或更少。对于一百个或更少的集合,使用这种方法(集合)应该很好@Tim是对的,如果项目数量非常大,那么这可能不是最好的方法,但是少于100个项目并不是非常大。此外,sets还具有消除重复的优势;数组列表允许您将多个相同项填充到数组中。以以下数组为例:{1,2,2,3}和{1,3}。左侧列表中不在右侧的项应该是{2},而不是{2,2}。这是为你准备的集合,而不是列表。哦,还有,是的,我更新了答案。我用错了字体。应该是MyObject。我实际上说的是相反的:查找两个哈希集的析取比查找两个ArrayList的析取(N log N与N^2)更有效,因此随着元素数量的增加,FrobberOfBits的建议成为更好的选择。但是N需要相对较大,然后才能在实践中看到差异,并且从每个ArrayList创建一个新的哈希集只是为了得到一个小的改进是不值得的,因为创建新的哈希集然后对其进行垃圾收集是有成本的。但是对于非常大的N来说,这是值得的。OP的新信息是,想要一个包含所有元素的集合,这些元素在其中一个元素中,而不是在另一个元素中,您需要更新您的答案,以解释array2中不在array1中的任何元素。你再也不能在原地这样做了。。。
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);
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
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);
}