Java比较两个列表的对象值?
我有两个列表* *ListA listA = new ArrayList()
**和ListB listB = new ArrayList()
都包含MyData和MyDatatypes的对象包含这些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()方法检查是否相等。
逻辑应该是这样的:
-
第一步:对于类MyData实现Comparable接口,按照每个对象的要求重写compareTo方法。
-
第二步:列表比较(检查空值之后),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 }
或者完全可以随意忽略它,并使用相等运算符。
- java.lang.IllegalArgumentException:指定为非null的参数为null:方法kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull
- setRequestedOrientation,但仍然根据传感器而改变