I have class Point
with overridden methods 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);
}
}
I create 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);
This is arrays of Points - combinations:
Point[] combinationPoints1 = {p1, p2, p3};
Point[] combinationPoints2 = {p1, p2, p4};
Point[] combinationPoints3 = {p1, p3, p4};
Point[] combinationPoints4 = {p2, p3, p4};
Create List<Point[]>
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
Compare 2 List<Point[]>
and get message true
:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
expectedResult.equals(expectedResult2); // TRUE
When I'm try change order to this:
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
List<Point[]> expectedResult2 = Arrays.asList(combinationPoints2, combinationPoints1, combinationPoints3, combinationPoints4);
When comparing, I get false
:
expectedResult.equals(expectedResult2); // FALSE
Why?
UPDATE 29.08.2020
I have 2 List<Point[]>
:
// FIRST
List<Point[]> expectedResult = Arrays.asList(combinationPoints1, combinationPoints2, combinationPoints3, combinationPoints4);
and
List<Point[]> actualResult = calculatePoint.getCombinationsElementsOver(startingPoints, pointsOnLine);
with contents:
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 (1.0; 2.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 (1.0; 4.0), Point (5.0; 5.0)]
for(Point[] p1 : actualResult) {
System.out.println(Arrays.toString(p1));
}
// SECOND
[Point (1.0; 1.0), Point (1.0; 2.0), Point (1.0; 4.0)]
[Point (1.0; 1.0), Point (1.0; 2.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 (1.0; 4.0), Point (5.0; 5.0)]
Through method I check identity lists:
private <T> boolean listEqualsIgnoreOrder(List<T> list1, List<T> list2) {
return new HashSet<>(list1).equals(new HashSet<>(list2));
}
Why I get false
when:
boolean result = listEqualsIgnoreOrder(expectedResult, actualResult);
>`.
– Louis Wasserman Aug 28 '20 at 18:24>`.