Java排序数组

标签 java sorting

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

相关文章:

java - 使用compareTo() 对电子邮件地址进行排序会返回意外结果

PHP 根据键排序数组,顺序为字母顺序,然后是数字,然后是特殊字符

java - 将 Maven Artifact 映射到 Debian 包

java - Commons VFS 和 Java.net.URL - 添加对 "sftp://"协议(protocol)的支持

java - 我在哪里可以获得 Spring 3.0 的 petclinic 示例应用程序?

java - 防止上传中间 Maven Artifact

Java - 尝试使用自定义比较器对 LinkedList 进行排序,找不到符号排序

java - 每个Android的location.Address方法返回什么?

mysql - 对在 mysql 查询中创建的对象数组内部进行排序

python - 根据子列表是否具有指定字符串对包含子列表的列表进行排序