问题描述
我的类Point
具有重写的方法equals()
和hashCode()
:
public class Point {
private double x;
private double y;
public Point() {
}
public Point(double x,double y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Point point = (Point) obj;
if (this.x != point.getX()) {
return false;
}
if (this.y != point.getY()) {
return false;
}
return true;
}
@Override
public int hashCode() {
return (int) (31 * x + y);
}
}
我创建了points
:
p1 = new Point(1.0,1.0);
p2 = new Point(1.0,2.0);
p3 = new Point(1.0,4.0);
p4 = new Point(5.0,5.0);
这是点数组-组合:
Point[] combinationPoints1 = {p1,p2,p3};
Point[] combinationPoints2 = {p1,p4};
Point[] combinationPoints3 = {p1,p3,p4};
Point[] combinationPoints4 = {p2,p4};
创建List<Point[]>
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints2,combinationPoints3,combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1,combinationPoints4);
比较2 List<Point[]>
并收到消息true
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints4);
expectedResult.equals(expectedResult2); // TRUE
当我尝试更改订单时:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2,combinationPoints1,combinationPoints4);
比较时,我得到false
:
expectedResult.equals(expectedResult2); // FALSE
为什么?
更新2020年8月29日
我有2个List<Point[]>
:
// FirsT
List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints4);
和
List<Point[]> actualResult = calculatePoint.getCombinationsElementsOver(startingPoints,pointsOnLine);
包含内容:
for(Point[] p1 : expectedResult) {
System.out.println(Arrays.toString(p1));
}
// FirsT
[Point (1.0; 1.0),Point (1.0; 2.0),Point (1.0; 4.0)]
[Point (1.0; 1.0),Point (5.0; 5.0)]
[Point (1.0; 1.0),Point (1.0; 4.0),Point (5.0; 5.0)]
[Point (1.0; 2.0),Point (5.0; 5.0)]
for(Point[] p1 : actualResult) {
System.out.println(Arrays.toString(p1));
}
// SECOND
[Point (1.0; 1.0),Point (5.0; 5.0)]
我通过方法检查身份列表:
private <T> boolean listEqualsIgnoreOrder(List<T> list1,List<T> list2) {
return new HashSet<>(list1).equals(new HashSet<>(list2));
}
为什么在以下情况下得到false
:
boolean result = listEqualsIgnoreOrder(expectedResult,actualResult);
解决方法
这两个列表具有相同的元素,但顺序不同:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1,combinationPoints2,combinationPoints3,combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2,combinationPoints1,combinationPoints4);
List.equals
方法认为两个列表包含相同顺序的“相同”元素时,它们是相等的。这两个列表确实具有相同的元素,但是它们的顺序不同。因此,equals
方法必须返回false
。
还有一个潜在的问题,是由于数组没有基于内容实现equals方法的事实:equals方法不会将两个具有相同内容的不同数组实例视为“ equal”。不过,这并没有发挥作用:无论如何,您所有的数组都有不同的内容。