gpt4 book ai didi

Java排序数组

转载 作者:行者123 更新时间:2023-12-01 17:53:54 24 4
gpt4 key购买 nike

我有这段代码,但它没有按预期工作。有人能告诉我为什么这不能正确按面积对三角形进行排序吗?我查看代码 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com