[英]Compare two ArrayList irrespective of order - Java
下面是兩個列表Some1和Some,它們實際上具有相同的對象數據,但是對象中元素的順序和數組中對象的順序不同。 我擔心的是下面必須返回true。 請寵愛
List<Some> lome1=new ArrayList<Some>();
Some some1 = new Some();
some1.setTime(1000);
some1.setStartTime(25);
some1.setEndTime(30);
lome1.add(some1);
Some some2 = new Some();
some2.setStartTime(125);
some2.setEndTime(130);
some2.setTime(100);
lome1.add(some2);
List<Some> lome2=new ArrayList<Some>();
Some some3 = new Some();
some3.setStartTime(125);
some3.setEndTime(130);
some3.setTime(100);
lome2.add(some3);
Some some = new Some();
some.setStartTime(25);
some.setTime(1000);
some.setEndTime(30);
lome2.add(some);
由於訂單而失敗的嘗試:
使用deepEquals:
if(Arrays.deepEquals(lome1.toArray(),lome2.toArray()) ){
System.out.println("equal");
}
else {
System.out.println("not equal");
}
使用哈希集,盡管數據相同,但兩者都給出了不同的哈希值
if(new HashSet<>(lome1).equals(new HashSet<>(lome2)) ){
System.out.println("equal");
}
else {
System.out.println("not equal");
}
檢查對象是否包含在另一個對象中
boolean x=true
for(Some d: lome1) {
if(!lome2.contains(d)) {
x = false;
}
}
if(x){
System.out.println("equal");
}
else {
System.out.println("not equal");
}
First Override哈希碼,等於Some Object,看起來像這樣,
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Some that = (Some) o;
return startTime == that.startTime &&
endTime == that.endTime &&
time == that.time
}
@Override
public int hashCode() {
return Objects.hash(startTime, endTime, time);
}
一旦設置了equals和Hashcode,則具有相同值的不同對象將提供相同的哈希碼,因此.equals()將返回true
現在使用list1.containsAll(list2) && list2.containsAll(list1);
比較這兩個列表作為HashSets可能是最好的方法,因為無論順序如何,它都可以工作。
但是,您的HashSet比較取決於您是否在“某些”類中實現equals()和hashCode()函數。 您尚未提供源代碼,所以我想您已經錯過了。 如果不重寫類中的這些方法,JRE將不知道兩個Some對象是否相同。
我在想這樣的事情:
@Override
public int hashCode() {
return getTime() + getStartTime() + getEndTime();
}
@Override
public boolean equals(Object o) {
if (o instanceof Some) {
Some other = (Some)o;
if (getTime() == other.getTime()
&& getStartTime() == other.getStartTime()
&& getEndTime() == other.getEndTime()) {
return true;
}
}
return false;
}
java集合提供的containsAll()
API。 lome1.containsAll(lome)
應該可以解決問題。
對於Java 1.8+,您可以檢查第一個列表的每個元素是否在第二個列表中,反之亦然:
boolean equals = lome1.stream().allMatch(e -> lome2.contains(e)) &&
lome2.stream().allMatch(e -> lome1.contains(e));
做這樣的事情
List<User> list = new ArrayList<>();
list.add(new User("User","20"));
list.add(new User("Some User","20"));
List<User> list1 = new ArrayList<>();
list1.add(new User("User","20"));
list1.add(new User("Some User","20"));
List<User> storeList = new ArrayList<>();
for (User user: list){
for (User user1:list1){
if (user.getName().equals(user1.getName()) && user.getAge().equals(user1.getAge()))
storeList.add(user);
}
}
boolean check = !storeList.isEmpty();
//OR
check = storeList.size() == list.size();
System.out.println(check);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.