如何根据对象值对不同类的对象进行排序

时间:2012-11-20 00:37:16

标签: java arrays sorting comparable

我设置了多个对象,所有对象都实现了同一个类。所有这些对象都有一个共同的方法,“getRatio”。我想按照“getRatio”方法的值以升序的数字顺序对这些对象进行排序,并让对象按顺序调用它们的toString方法。我试图应用这个想法,但我只是自己订购数字。

    List shapeList = new ArrayList();
    shapeList.add(rectangle);
    shapeList.add(triangle_right);
    shapeList.add(isosceles);
    shapeList.add(triangle);
    shapeList.add(triangle2);
    shapeList.add(triangle3);
    Collections.sort(shapeList);
    for (Shape shape : shapeList) {
        System.out.println(shape.toString());
    }

找不到合适的添加方法(RightTriangle)         shapeList.add(triangle_right);

错误:找不到符号         Comparable.sort(shapeList);

3 个答案:

答案 0 :(得分:2)

您可以为Comparator方法提供Arrays.sort()。在你的情况下,它看起来像这样(我假设getRatio方法在一个共同的Shape类/接口):

public class ShapeComparator implements Comparator<Shape> { 
    int compareTo (final Shape shape1, final Shape shape2) {
        return (int) Math.signum (shape1.getRatio () - shape2.getRatio ());
    }
}

您还可以使您的公共类实现Comparable接口,如下所示:

public class Shape implements Comparable<Shape> {
    int compareTo (final Shape other) {
        return (int) Math.signum (getRatio () - other.getRatio ());
    }
}

答案 1 :(得分:1)

扩展其他答案,您可以定义Comparator并按如下方式对数组进行排序:

Arrays.sort(myArray, new Comparator<MyClass>() {
    @Override
    public int compare(MyClass c1, MyClass c2) {
        return (new Double(c1.getRatio())).compareTo(c2.getRatio());
    }
});

如果你计划对这样的多个数组进行排序,那么让MyClass实现Comparable接口是明智的。


编辑 :要对List进行排序(例如ArrayList s),您可以使用类似的概念,但使用{{1} }:

Collections.sort

相关文件:

答案 2 :(得分:0)

您应该使您的Object实现 Comparable

More info here

您需要实现 compareTo(),以便比较两个对象的比例。

您可以这样做:

class Foo implements Comparable<Foo> {

    private double ratio;

    public double getRatio() {
        return ratio;
    }

    public int compareTo(Foo otherFoo) {
        if (otherFoo == null) {
            return -1;
        }
        return ratio - otherFoo.ratio;
    }

}

以下是对Foo对象集合进行排序的方法:

List<Foo> fooList = createFooList();
Collections.sort(fooList);

// print the Foos in order

for (Foo f : fooList) {
    System.out.println(f.toString());
}