Array.sort():Comparable的compareTo()只接受一个参数?

时间:2017-11-26 19:41:00

标签: java arrays sorting object

这对你们所有人来说都很好;我已经把头发拉了好几个小时试图找出这个:

我正在尝试使用Array.sort()按层排序对象数组,并按照另一个堆栈溢出帖子的教程,我尝试了这段代码:

Arrays.sort(gameobj, new Comparator<GameObject>() {
    @Override
    public int compare(GameObject o1, GameObject o2) {
        return o1.layer.compareTo(o2.layer);
    }});

这段代码对我有意义,但问题是,接口只接受compare()方法的一个参数。我也尝试过lambda表达式,但是会抛出“删除此令牌”编译错误。我正在使用Java 8.非常感谢任何帮助或建议。

4 个答案:

答案 0 :(得分:1)

因为{{3}}用于比较两个元素ab,其中a是实施Object。如果您使用的是Comparable,那么您无需将Comparator传递给Arrays.sort方法(它将使用实例本身来执行比较)。

答案 1 :(得分:1)

简洁的简写

从类的方法返回的可比较输出创建比较器的最简洁方法如下:

Arrays.sort(gameobj, Comparator.comparing(GameObject::getLayer));

另一个解决方案:实现Comparable

在您的情况下,您可能希望直接实施Comparable并将比较委托给Layer类:

public class GameObject implements Comparable<GameObject> {
    // ...

    @Override
    public int compareTo(GameObject that) {
        return this.getLayer().compareTo(that.getLayer());
    }
}

Arrays.sort(gameobj);

何时使用Comparable vs Comparator

  • Comparable用于在类上实现自然顺序。如果您的课程自然带有任何人都期望的订单关系,那么Comparable非常适合您。

  • Comparator更适合特定用例中的特定排序逻辑。它允许您从元素本身的类中分离您想要对特定上下文中的元素进行排序的方式。它更灵活,因为您可以在任意数量的上下文中提供任意数量的比较器,而对于给定的类,您只能实现Comparable一次。

答案 2 :(得分:1)

Java中有两种比较类型。

比较器 - 接受2个参数,它与模型解耦,可以根据不同情况使用多个比较器进行比较。它更有活力。

可比较 - 这是一个接口,您的模型(实体)必须实现方法,该方法将自己与同一类型的另一个实体进行比较。这不太灵活,但为您提供了“默认”排序方法。这样做的缺点是你无法在运行时更改它。

所以你的Arrays.sort和Lists.sort一样需要一个额外的参数-comparator,这样你就可以选择在运行时使用哪个Comparator:

Arrays.sort(gameobj, Comparators.comparing(GameObject::getLayer))

答案 3 :(得分:0)

您可以按照以下方式重构代码:

Arrays.sort(gameobj, Comparator.naturalOrder());

EDITED:如果gameobj的对象实现了Comparable接口,这是一个解决方案。