【问题标题】:Sorting ints in java returns negative numbers first?在java中排序整数首先返回负数?
【发布时间】:2014-06-26 08:28:16
【问题描述】:

我有一个像这样的比较器:

Collections.sort( sortedPlayers, new Comparator<RoundPlayer>()
{
    public int compare(RoundPlayer p1, RoundPlayer p2)
    {
        return p1.getScore() - p2.getScore();
    }
});

Sorted player 是玩家对象的列表,他们返回的分数是整数,例如,200、-300、1000 等。

比较器的目标是对它们进行排序,使它们按降序排列,1000、200、-300。

但是,这个比较器似乎返回了不稳定的结果。通常首先出现负数。

【问题讨论】:

  • 是不稳定还是升序?
  • 它看起来很不稳定,但是它的设置方式,我只能在少数玩家得分的情况下对其进行测试。
  • 负数在自然排序中总是在正数之前。 mathatube.com/sitebuilder/images/number-line-600x271.png
  • 我几乎想知道它是否以某种方式按大小而不是按顺序排序....您能否提供一个带有相应输出的输入示例?
  • getScore()的返回类型是什么?会不会有整数下/溢出?

标签: java sorting


【解决方案1】:

只需反转您当前拥有的返回值

样本

return p2.getScore() - p1.getScore(); //will sort in descending order

【讨论】:

    【解决方案2】:

    如果您想按降序排序,请考虑使用Collections.reverseOrder(Comparator cmp) 包装您的Comparator

    还要注意,由于整数溢出,将这两个值相减是一个坏主意。你的compare 逻辑是p1.getScore() - p2.getScore()。考虑 p1.score = 2147483647, p2.score = -2147483648,您的比较器将返回 -1,错误地表示 p1 的分数小于 p2 的分数。

    正确的逻辑是测试 ,返回 -1、0 和 1。更好的是,Integer 已经实现了这个逻辑,所以你可以简单地委托给它的 compareTo 方法。

    return Integer.valueOf(p1.getScore()).compareTo(Integer.valueOf(p2.getScore());
    

    【讨论】:

    • 我在 Google 上搜索了“android 排序负数对象列表”,她将我引导到这里,将您的精彩解释作为第一个结果。这似乎是一个罕见的问题案例,但我试图根据他们的 Bucket Id 对 MediaStore 文件列表进行排序,但出现错误时我注意到 Bucket id 的负值可能是问题的根源。你的信息对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多