【问题标题】:Java wont sort arraylist of abstract classesJava不会对抽象类的arraylist进行排序
【发布时间】:2018-06-04 21:12:21
【问题描述】:

我有一个问题。我编写了简单的抽象类,我尝试对该类的数组列表进行排序,并为 compareTo 函数实现了 Comparator 接口,但 List.sort 给出了错误。请帮助。这是一个代码:

public abstract class Antena implements Comparator<Antena>{
    private double x, y;

    public Antena(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    @Override
    public int compare(Antena o1, Antena o2) {
        return (int)(o1.getX()-o2.getX());
    }
}

在主课中我有:

List<Antena> anteneObj=new ArrayList<>();
anteneObj.add(.....);
....
....
Collections.sort(anteneObj);

这给了我一个错误并且不会对列表进行排序。有什么问题?我应该在扩展类中扩展或实现某些东西。当然,我有 2 个扩展抽象 Antena 类的类。

【问题讨论】:

  • 这给了我一个错误哪个错误?
  • double 的范围比int 大很多 - 使用a - b 并转换为int 是一个非常糟糕的主意...跨度>
  • 你正在对Antena的实例进行排序,所以它需要实现Comparable&lt;T&gt;,而不是Comparator&lt;T&gt;。
  • 不存在类型变量 T 的实例,因此 Antena 符合 Comparable
  • 我也尝试过类似但不起作用。

标签: java arrays sorting object


【解决方案1】:

引用自Collections.sort(List&lt;T&gt;):

按照升序对指定列表进行排序 Comparable 其元素的自然排序。 列表中的所有元素都必须实现Comparable 接口。

因此,为了能够按Collections.sort(List&lt;T&gt;)排序 你的班级Antena 应该实现接口Comparable&lt;Antena&gt; 而不是Comparator&lt;Antena&gt;:

public abstract class Antena implements Comparable<Antena> {

    ....

    @Override
    public int compareTo(Antena o) {
        return Double.compare(this.getX(), o.getX());
    }
}

【讨论】:

  • 我试过完全一样,但我有同样的错误。
  • 不存在类型变量 T 的实例,因此 Antena 符合 Comparable
【解决方案2】:

compare 方法应返回 -1 或 0 或 1。您的实现可能会返回错误值。实现 Comparable 并返回 Double.compare(double, double)。

【讨论】:

  • 没有函数返回大于或等于 0 的东西。不存在问题
  • 虽然评论(它是评论,而不是答案)得出了正确的结论,但断言“compare 方法应返回 -1 或 0 或 1”是错误的。如果您要阅读the documentation - “返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。”。
猜你喜欢
  • 2014-11-09
  • 2017-10-21
  • 2012-04-26
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2011-05-11
相关资源
最近更新 更多