簡體   English   中英

比較兩個ArrayList的順序無關-Java

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM