【问题标题】:int cannot be dereferenced while sorting list by Integer property在按 Integer 属性排序列表时无法取消引用 int
【发布时间】:2017-12-25 21:16:41
【问题描述】:

我有一个 2D 数组,并将其填充到 Segment 类型的 ArrayList(我已经定义了一个类)。我想根据每个对象中的第二个元素按升序对 Arraylist 进行排序。我检查了这个link,它使用可比较的类对其进行排序,但它不适用于我,它给了我

int 不能被取消引用

错误。

下面是我的代码

请注意,object.getR() 给了我每个对象的中间元素。例如,segment 类型的对象x= (6,8,4) 然后x.gerR() 给我的值是8。

int[][] input = {
    {0, 3, 3}, {3,5,2}, {6,8,4}, {9,11,3}, {2,4,4}, {5,6,3}, {7,8,3},{9,12,1}
};

ArrayList<Segment> data = new ArrayList<>();

for (int[] input1 : input) {
    data.add(new Segment(input1[0], input1[1], input1[2]));
}
Collections.sort(data, new Comparator<Segment>() {
    @Override
    public int compare(Segment lhs, Segment rhs) {
        return lhs.getR().compareTo(rhs.getR());
    }
});

【问题讨论】:

  • “但它对我不起作用”它到底对你不起作用?您是否收到错误/异常/与预期不同的结果(例如升序而不是降序)?
  • 请发布您看到的实际错误消息。
  • 您的问题与排序无关。这是一个编译错误。

标签: java arrays sorting arraylist


【解决方案1】:

int cannot be dereferenced 建议 getR() 返回 int 而不是 Integer (尽管您的标题暗示了什么)。 intprimitive 类型,因此它没有像 compareTo 这样的任何方法。比较 int 值的最简单方法是通过Integer.compare(a, b)(默认情况下它根据升序返回结果,如果你想获得降序的结果Integer.compare(b, a))。

所以改变

return lhs.getR().compareTo(rhs.getR());

return Integer.compare(lhs.getR(), rhs.getR());

顺便说一句,从 Java 8 开始,我们可以使用 Lambda 和方法引用。列表现在还有sort(Comparator) 方法,它允许我们编写如下代码:

data.sort(Comparator.comparingInt(Segment::getR));

而不是

Collections.sort(data, new Comparator<Segment>() {
    @Override
    public int compare(Segment lhs, Segment rhs) {
        return Integer.compare(lhs.getR(), rhs.getR());
    }
});

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多