Java:Collections.sort没有工作属性?

时间:2018-05-24 17:53:05

标签: java list sorting

所以我有一个列表announceList,其列表中包含Announces,我试图按升序排列列表的百分比值,所以如果我得到了列表这样:

Announce1 - 20.10%
Announce2 - 20.54%
Announce3 - 27.50%
Announce4 - 76.36%

排序后我想要这样的列表:

Announce4 - 76.36%
Announce3 - 27.50%
Announce2 - 20.54%
Announce1 - 20.10%

我使用的方法是:

Collections.sort(announceList, new Comparator<Announce>() {
   @Override
   public int compare(Announce o1, Announce o2) {
       int i1 = o1.getMatchPercentage().intValue();
       int i2 = o2.getMatchPercentage().intValue();
       return Integer.compare(i1, i2);
   }
});

adapter.setAnnounceList(announceList);
adapter.notifyDataSetChanged();

但是我没有得到我想要的清单,如果你知道我做错了什么,请告诉我,任何帮助都会有所帮助,谢谢。

3 个答案:

答案 0 :(得分:2)

如果您希望小数位数影响您的排序,则需要比较实际double/float值,即避免74.5&gt; 74.9。此外,由于您希望排序按降序排列,因此您可以尝试使用Double.compare()

Collections.sort(announceList, new Comparator<Announce>() {
   @Override
   public int compare(Announce o1, Announce o2) {
       return Double.compare(o2.getMatchPercentage(), o1.getMatchPercentage());
   }
});

如果您使用的是Java 8或更高版本,您也可以这样做:

announceList.sort(Comparator.comparingDouble(Announce::getMatchPercentage).reversed());

这是一个使用普通双打的小例子:

public static void main(String[] args) {
    List<Double> list = new ArrayList<Double>();
    list.add(20.10);
    list.add(20.54);
    list.add(27.50);
    list.add(76.36);

    System.out.println("Before sort:");
    for(Double d : list) {
        System.out.println(d);
    }
    System.out.println();

    Collections.sort(list, new Comparator<Double>() {
        @Override
        public int compare(Double o1, Double o2) {
            return Double.compare(o2, o1);
        }
    });

    System.out.println("After sort:");
    for(Double d : list) {
        System.out.println(d);
    }
}

输出:

Before sort:
20.1
20.54
27.5
76.36

After sort:
76.36
27.5
20.54
20.1

答案 1 :(得分:2)

从Java 8开始,有一种更方便的方法来执行此类操作:

announceList.sort(Comparator.comparingDouble(Announce::getMatchPercentage).reversed());

忽略reversed()以升序排序列表。

这使用了Java 8中新增的comparingDouble()方法。

答案 2 :(得分:0)

来自Comparator::compare

的Java文档
  

比较其订单的两个参数。当第一个参数小于,等于或大于第二个参数时,返回负整数,零或正整数。

因此,为了对升序进行排序,您需要反转Integer.compare的参数顺序,例如:

Integer.compare(i2, i1);

或者如评论中所建议的那样:

return o1.getMatchPercentage().intValue() -o2.getMatchPercentage().intValue();

但是,为了精确,您应该使用Double.compare