不考虑顺序比较两个ArrayList-Java
下面是两个列表Some1和Some1,它们实际上具有相同的对象数据,但在对象中元素的顺序和数组中对象的顺序上不同。我的担心是下面必须返回真实。请帮忙不考虑顺序比较两个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
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和endtimecontainsAll()
方法可能是你的答案?部分
类的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