如何以降序排序ArrayList <Long>?


98

如何ArrayList<Long>在Java中按降序排序?

Answers:


240

这是您的一种方式list

list.sort(null);
Collections.reverse(list);

或者,您可以实施自己Comparator的排序并消除相反的步骤:

list.sort((o1, o2) -> o2.compareTo(o1));

甚至更简单地使用,Collections.reverseOrder()因为您只需要反转:

list.sort(Collections.reverseOrder());

6
l1 > l2 ? -1 : l1 == l2 ? 0 : 1这段代码很荒谬。o1.compareTo(o2)然后使用。
ilalex

4
@ilya:哦,是的,很好,尽管它需要在o2.compareTo(o1)这里:)
WhiteFang34

2
list.sort(Collections.reverseOrder());
tunix

竖起大拇指list.sort((o1, o2) -> o2.compareTo(o1))
arenaq

27
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);

仅在该变量声明上带有泛型参数。
汤姆·哈特芬

18

您可以使用下面给出的以下代码;

Collections.sort(list, Collections.reverseOrder());

或者,如果您要使用自定义比较器,则可以按照以下说明使用

Collections.sort(list, Collections.reverseOrder(new CustomComparator());

其中CustomComparator是一个比较器类,用于比较列表中存在的对象。


10

Java 8

在Java 8中做到这一点非常有趣且容易

Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);

Lambda表达式在这里震撼!!!

如果您需要一个以上的行逻辑来比较ab,则可以这样编写

Collections.sort(variants,(a,b)->{
    int result = a.compareTo(b);
    return result;
});

1
我认为,如果将其更改为b.compareTo(a),则无需撤消集合。
zawhtut 2015年

@zawhtut,完全正确!刚才提到了reverse(),这样您就知道了选择,选择就是您自己
azerafati 2015年

您必须将long转换为Long吗?
BluE


3

对于您的long值位于对象中某处的lamda,我建议使用:

.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))

甚至更好:

.sorted(Comparator.comparingLong(MyObject::getLong))


2

如下实现我们自己的比较器的更通用方法

Collections.sort(lst,new Comparator<Long>(){
                public int compare(Long o1, Long o2) {
                    return o2.compareTo(o1);
                }
            });


1

以下方法将按降序对列表进行排序,并处理' null '值,以防万一,如果您有任何null值,则Collections.sort()将抛出NullPointerException

      Collections.sort(list, new Comparator<Long>() {
          public int compare(Long o1, Long o2) {
                  return o1==null?Integer.MAX_VALUE:o2==null?Integer.MIN_VALUE:o2.compareTo(o1);

        }
    });

0

您也可以ArrayList使用TreeSet而不是来对进行排序comparator。这是我之前对整数数组提出的一个问题示例。我使用“数字”作为的占位符名称ArrayList


     import.java.util.*;
        class MyClass{
        public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        ArrayList<Integer> numbers = new ArrayList<Integer>(); 

        TreeSet<Integer> ts = new TreeSet<Integer>(numbers);
        numbers = new ArrayList<Integer>(ts);
        System.out.println("\nThe numbers in ascending order are:");
        for(int i=0; i<numbers.size(); i++)
        System.out.print(numbers.get(i).intValue()+" ");
        System.out.println("\nThe numbers in descending order are:");
        for(int i=numbers.size()-1; i>=0; i--)
        System.out.print(numbers.get(i).intValue()+" ");
    }
}

TreeSet不会存储重复的值。

0

因此,我想提出一些我认为很重要的事情,我认为您应该考虑一下。运行时和内存。假设您有一个列表并希望对其进行排序,那么可以,有一个内置的排序列表,也可以开发自己的列表。然后您说,要反转列表。那就是上面列出的答案。

但是,如果要创建该列表,则最好使用其他数据结构来存储它,然后将其转储到数组中。

堆就是这样做的。您过滤数据,它将处理所有内容,然后可以从对象中弹出所有内容并将其排序。

另一个选择是了解地图的工作方式。很多时候,Map或HashMap被称为“事物”,其背后都有一个潜在的概念。

例如,您输入了一堆键值对,其中键是长键,当您添加所有元素时,您可以执行以下操作: .keys它会自动返回排序列表。

这取决于您如何处理数据以及我认为应该如何继续进行排序和后续的反向操作


0

比较器的比较方法可用于比较对象,然后reversed()可应用该方法来颠倒顺序-

list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.