Java比较两个列表的对象值?

我有两个列表* *ListA listA = new ArrayList() **和ListB listB = new ArrayList()都包含MyDataMyDatatypes的对象包含这些variables。

 MyData { String name; boolean check; } 

ListA和ListB都包含MyData对象,现在我必须比较列表的对象值这里名称以及检查variables,如果ListA包含这些对象值

 ListA = ["Ram",true],["Hariom",true],["Shiv",true]; 

和ListB也包含

 ListB = ["Ram",true],["Hariom",true],["Shiv",true]; 

那么我必须比较列表,并返回false,因为这两个列表是相同的但是,如果ListA包含

 ListA = ["Ram",true],["Hariom",true],["Shiv",false]; 

ListB包含

  ListB = ["Ram",true],["Hariom",true],["Shiv",true]; 

那么我必须比较列表并返回true,因为这两个列表不相同

反之亦然,所以任何列表值的任何轻微的变化,我必须返回true。 有一件事我不得不在这里提到对象可以以任何顺序。

这不是最有效的解决方案,但最简单的代码是:

 boolean equalLists = listA.size() == listB.size() && listA.containsAll(listB); 

更新:

@WesleyPorter是对的。 如果重复的对象在集合中,上面的解决方案将不起作用。
要获得完整的解决方案,您需要遍历集合,以便正确处理重复的对象。

 private static boolean cmp( List l1, List l2 ) { // make a copy of the list so the original list is not changed, and remove() is supported ArrayList cp = new ArrayList<>( l1 ); for ( Object o : l2 ) { if ( !cp.remove( o ) ) { return false; } } return cp.isEmpty(); } 

更新2014年10月28日:

@RoeeGavriel是对的。 return语句需要是有条件的。 上面的代码被更新。

ArrayList已经支持这个,用equals方法。 引用文档

换句话说,如果两个列表按照相同的顺序包含相同的元素,则它们被定义为相等。

它确实要求您在MyData类中正确实现equals

编辑

你已经更新了这个问题,说明这个列表可能有不同的顺序。 在这种情况下,首先对列表进行排序,然后应用equals。

我得到了解决上述问题的办法

 public boolean compareLists(List prevList, List modelList) { if (prevList.size() == modelList.size()) { for (MyData modelListdata : modelList) { for (MyData prevListdata : prevList) { if (prevListdata.getName().equals(modelListdata.getName()) && prevListdata.isCheck() != modelListdata.isCheck()) { return true; } } } } else{ return true; } return false; } 

编辑: –
我们怎样才能涵盖这个…想象一下,如果你有两个数组“A”,真“B”,真“C”,真和“A”,真“B”,真“D”真。 即使数组一有C,而数组二有D,也没有检查可以捕捉到( 由@Patashu提及 )..所以我做了下面的改变。

 public boolean compareLists(List prevList, List modelList) { if (prevList!= null && modelList!=null && prevList.size() == modelList.size()) { boolean indicator = false; for (MyData modelListdata : modelList) { for (MyData prevListdata : prevList) { if (prevListdata.getName().equals(modelListdata.getName()) && prevListdata.isCheck() != modelListdata.isCheck()) { return true; } if (modelListdata.getName().equals(prevListdata.getName())) { indicator = false; break; } else indicator = true; } } } if (indicator) return true; } } else{ return true; } return false; } 

看看这是否有效。

 import java.util.ArrayList; import java.util.List; public class ArrayListComparison { public static void main(String[] args) { List list1 = new ArrayList(); list1.add(new MyData("Ram", true)); list1.add(new MyData("Hariom", true)); list1.add(new MyData("Shiv", true)); // list1.add(new MyData("Shiv", false)); List list2 = new ArrayList(); list2.add(new MyData("Ram", true)); list2.add(new MyData("Hariom", true)); list2.add(new MyData("Shiv", true)); System.out.println("Lists are equal:" + listEquals(list1, list2)); } private static boolean listEquals(List list1, List list2) { if(list1.size() != list2.size()) return true; for (MyData myData : list1) { if(!list2.contains(myData)) return true; } return false; } } class MyData{ String name; boolean check; public MyData(String name, boolean check) { super(); this.name = name; this.check = check; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (check ? 1231 : 1237); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MyData other = (MyData) obj; if (check != other.check) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } 

首先实现MyData.equals(Object o)MyData.hashCode()方法。 一旦你实现了equals方法,你可以遍历列表如下:

 if(ListA == null && ListB == null) return false; if(ListA == null && ListB != null) return true; if(ListA != null && ListB == null) return true; int max = ListA.size() > ListB.size() ? ListA.size() : ListB.size(); for(int i = 0; i < max; i++) { myData1 = ListA.get(i); myData2 = ListB.get(i); if(!myData1.equals(myData2)) { return true; } } return false; 

我发现列表比较的一个非常基本的例子列表比较这个例子首先validation大小,然后检查另一个列表的特定元素的可用性。

重写你的类中的equals方法并使用Collection#equals()方法检查是否相等。

逻辑应该是这样的:

  1. 第一步:对于类MyData实现Comparable接口,按照每个对象的要求重写compareTo方法。

  2. 第二步:列表比较(检查空值之后),2.1检查两个列表的大小,如果相等返回true否则返回false,继续对象迭代2.2如果步骤2.1返回true,迭代元素从列表和调用类似的东西,

    listA.get(ⅰ).compareTo(listB.get(i))的

这将按照步骤1中提到的代码。

您可以使用CollectionUtils.subtract从另一个列表中减去一个列表,如果结果为空集合,则表示两个列表相同。 另一种方法是使用CollectionUtils.isSubCollection或CollectionUtils.isProperSubCollection。

对于任何情况,你应该为你的对象实现equals和hashCode方法。

使用java 8 removeIf来比较相似的项目

 public int getSimilarItems(){ List one = Arrays.asList("milan", "dingo", "elpha", "hafil", "meat", "iga", "neeta.peeta"); List two = new ArrayList<>(Arrays.asList("hafil", "iga", "binga", "mike", "dingo")); //Cannot remove directly from array backed collection int initial = two.size(); two.removeIf(one::contains); return initial - two.size(); } 

从那时起已经有5年了,幸好我们现在有了Kotlin。
现在比较两个列表看起来很简单:

 fun areListsEqual(list1 : List, list2 : List) : Boolean { return list1 == list2 } 

或者完全可以随意忽略它,并使用相等运算符。