我设置了多个对象,所有对象都实现了同一个类。所有这些对象都有一个共同的方法,“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);
答案 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 。
您需要实现 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());
}