【问题标题】:Array.sort(): Comparable's compareTo() only takes one argument?Array.sort():Comparable 的 compareTo() 只接受一个参数?
【发布时间】:2017-11-26 19:40:59
【问题描述】:

这对你们所有人来说都是一件好事;几个小时以来,我一直在努力解决这个问题:

我正在尝试使用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。非常感谢任何帮助或建议。

【问题讨论】:

  • 嗯? Comparator.compare 接受 两个 参数。
  • layer是什么类型?
  • 看不懂,但是比较方法有两个参数
  • 请向我们展示您有疑问的代码,即您使用Array.sort() 的代码。不清楚您的问题是什么。
  • @Aominè 如果是int,最好使用Comparator.comparingInt()

标签: java arrays sorting object


【解决方案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】:

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

    【讨论】:

      【解决方案3】:

      Java 中有两种比较方式。

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • OP没有提到GameObject实现Comparable
        • 如果是这样,您甚至不需要通过比较器。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 2021-05-05
        • 2013-12-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多