无论顺序如何,比较两个ArrayList - Java

时间:2018-03-14 11:17:52

标签: java arrays arraylist

下面是两个列表Some1和Some,它们实际上具有相同的对象数据但是对象中的元素顺序和数组中对象的顺序不同。我关注的是下面必须回归真实。请支持

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");
          }

使用hashset,虽然数据相同,但两者都给出了不同的哈希值

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");
          }

5 个答案:

答案 0 :(得分:2)

首先覆盖哈希码和等于某些对象,它可能看起来像这样,

    @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);

答案 1 :(得分:2)

将两个列表比较为HashSets可能是最好的方法,因为无论顺序如何都可以。

但是,您的HashSet比较取决于您在“Some”类中实现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;
}

答案 2 :(得分:0)

java集合提供的containsAll() API。 lome1.containsAll(lome)应该做到这一点。

答案 3 :(得分:0)

对于Java 1.8+,您可以检查第一个列表的每个元素是否在第二个列表中,反之亦然:

        boolean equals = lome1.stream().allMatch(e -> lome2.contains(e)) &&
            lome2.stream().allMatch(e -> lome1.contains(e));

答案 4 :(得分:0)

做这样的事

<div class="profile-body">
 <div class="col-lg-12">
  <div class="tabbable">
  <ul class="nav nav-tabs tabs-flat  nav-justified" id="myTab11">
    <li class="active">
      <a href="#overview" data-toggle="tab">
        Tab 
      </a>
    </li>
    <li class="tab-red">
      <a href="#timeline" data-toggle="tab">
          Tab Tab
      </a>
    </li>
  </ul>
  <div class="tab-content tabs-flat">
    <div class="tab-pane active" id="overview">
      <div class="row">
        <!--Information-->
      </div>
      <div id="timeline" class="tab-pane">
      </div>
    </div>
  </div>
</div>