不考虑顺序比较两个ArrayList-Java

不考虑顺序比较两个ArrayList-Java,java,arrays,arraylist,Java,Arrays,Arraylist,下面是两个列表Some1和Some1,它们实际上具有相同的对象数据,但在对象中元素的顺序和数组中对象的顺序上不同。我的担心是下面必须返回真实。请帮忙 List<Some> lome1=new ArrayList<Some>(); Some some1 = new Some(); some1.setTime(1000); some1.setStartTime(25); some1.setEndT

下面是两个列表Some1和Some1,它们实际上具有相同的对象数据,但在对象中元素的顺序和数组中对象的顺序上不同。我的担心是下面必须返回真实。请帮忙

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);
对于hashset,虽然数据相同,但两者都给出了不同的哈希值

if(new HashSet<>(lome1).equals(new HashSet<>(lome2)) ){
            System.out.println("equal");
        }
          else {
              System.out.println("not equal");
          }
包含java集合提供的sall()
API。
lome1.containsAll(lome)
应该可以做到这一点。

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

首先覆盖hashcode并对某些对象使用equals,它可能如下所示

    @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,那么具有相同值的不同对象将给出相同的Hashcode,因此.equals()将返回true

现在使用列表
list1.containsAll(list2)和&list2.containsAll(list1)

首先覆盖hashcode并对某些对象使用equals,它可能如下所示

    @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,那么具有相同值的不同对象将给出相同的Hashcode,因此.equals()将返回true

现在使用列表
list1.containsAll(list2)和&list2.containsAll(list1)

将两个列表作为哈希集进行比较可能是最好的方法,因为这样做不考虑顺序

但是,HashSet比较取决于您在“Some”类中实现equals()和hashCode()函数。你没有提供来源,所以我猜你错过了。如果不重写类中的这些方法,JRE就不知道两个对象是否相同

我是这样想的:

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

将这两个列表作为哈希集进行比较可能是最好的方法,因为不管顺序如何都可以

但是,HashSet比较取决于您在“Some”类中实现equals()和hashCode()函数。你没有提供来源,所以我猜你错过了。如果不重写类中的这些方法,JRE就不知道两个对象是否相同

我是这样想的:

@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 1.8+,您可以检查第一个列表的每个元素是否在第二个列表中,反之亦然:

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

对于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);
List List=new ArrayList();
添加(新用户(“用户”,“20”));
添加(新用户(“某些用户”、“20”);
List list1=新的ArrayList();
列表1.添加(新用户(“用户”,“20”));
列表1.添加(新用户(“某些用户”,“20”));
List storeList=new ArrayList();
用于(用户:列表){
for(用户user1:list1){
if(user.getName().equals(user1.getName())&&user.getAge().equals(user1.getAge()))
storeList.add(用户);
}
}
布尔检查=!storeList.isEmpty();
//或
check=storeList.size()==list.size();
系统输出打印项次(检查);
像这样做

        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);
List List=new ArrayList();
添加(新用户(“用户”,“20”));
添加(新用户(“某些用户”、“20”);
List list1=新的ArrayList();
列表1.添加(新用户(“用户”,“20”));
列表1.添加(新用户(“某些用户”,“20”));
List storeList=new ArrayList();
用于(用户:列表){
for(用户user1:list1){
if(user.getName().equals(user1.getName())&&user.getAge().equals(user1.getAge()))
storeList.add(用户);
}
}
布尔检查=!storeList.isEmpty();
//或
check=storeList.size()==list.size();
系统输出打印项次(检查);

containsAll()
方法可能是你的答案?部分
类的Post code只有pojo时间,starttime和endtime
containsAll()
方法可能是你的答案?部分
类的Post code只有pojo时间,starttime和EndTimeContainesAll用于收集,不是吗?我还是不明白你实现了一些的equals方法了吗?
a.containsAll(b)
返回true也可能意味着a是b的超集,因此实际上并不相等。你的equals方法在某些情况下是什么样子的?containsAll用于集合,不是吗?我还是不明白,你实现了一些的equals方法了吗?
a.containsAll(b)
返回true也可能意味着a是b的超集,因此实际上并不相等。你的equals方法在某些情况下是什么样子的?显然,一些的equals/hashCode应该被覆盖,例如Drewll post。显然,一些的equals/hashCode应该被覆盖,例如作为Drewll posted。我得到类强制转换异常,声明一些不能被强制转换为Comparator;或者得到类强制转换异常,声明一些不能被强制转换为Comparator