我有这段代码,但它没有按预期工作。有人能告诉我为什么这不能正确按面积对三角形进行排序吗?我查看代码 1 小时,无法意识到问题出在哪里,当我运行程序时,它对其中一些进行了排序,但其中很少有未排序的。
import java.util.Arrays;
import java.util.Comparator;
class Triangle {
public final int a;
public final int h;
public Triangle(int a, int h) {
this.a = a;
this.h = h;
}
@Override
public String toString() {
return "Triangle: a = " + a + " cm and h = " + h + " cm";
}
}
class Program {
public static void main(String[] args) {
Triangle[] triangles = new Triangle[] {
new Triangle(1, 6),
new Triangle(1, 1),
new Triangle(1, 5),
new Triangle(1, 8),
new Triangle(1, 2),
new Triangle(1, 4),
new Triangle(1, 7),
new Triangle(1, 9),
new Triangle(1, 3)
};
System.out.println("ORIGINAL:");
for (Triangle t : triangles) {
System.out.println(t);
}
Arrays.sort(triangles, new CmpByArea());
System.out.println();
System.out.println("SORTED:");
for (Triangle t : triangles) {
System.out.println(t);
}
}
}
class CmpByArea implements Comparator<Triangle> {
@Override
public int compare(Triangle t1, Triangle t2) {
double area1 = t1.a * t1.h / 2;
double area2 = t2.a * t2.h / 2;
return (int) Math.signum(area1 - area2);
}
}
最佳答案
你需要一个唯一的标志。因此,您不应该除以 2 并使用 double
。
class CmpByArea implements Comparator<Triangle> {
@Override
public int compare(Triangle t1, Triangle t2) {
return Integer.compare(t1.a * t1.h, t2.a * t2.h);
}
}
您也可以只使用 lambda
Arrays.sort(triangles, (t1, t2) -> (Integer.compare(t1.a * t1.h, t2.a * t2.h)));
编辑: 正如 @erickson 在评论中提到的,消除整数溢出是值得的:
Arrays.sort(triangles, (t1, t2) -> (Integer.compare(Math.multiplyExact(t1.a, t1.h), Math.multiplyExact(t2.a, t2.h))));
关于Java排序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47104988/