如何按降序对 ArrayList<Long> 进行排序?
Posted
技术标签:
【中文标题】如何按降序对 ArrayList<Long> 进行排序?【英文标题】:How to sort ArrayList<Long> in decreasing order? 【发布时间】:2011-08-19 04:26:20 【问题描述】:如何在Java中对ArrayList<Long>
进行降序排序?
【问题讨论】:
【参考方案1】:这是您list
的一种方式:
list.sort(null);
Collections.reverse(list);
或者您可以实现自己的Comparator
来排序并消除反向步骤:
list.sort((o1, o2) -> o2.compareTo(o1));
或者更简单地使用Collections.reverseOrder()
,因为你只是在倒车:
list.sort(Collections.reverseOrder());
【讨论】:
l1 > l2 ? -1 : l1 == l2 ? 0 : 1
这个代码太荒谬了。然后使用o1.compareTo(o2)
。
@ilya: 哦,是的,好点,虽然这里需要o2.compareTo(o1)
:)
list.sort(Collections.reverseOrder());
为list.sort((o1, o2) -> o2.compareTo(o1))
点赞【参考方案2】:
Comparator<Long> comparator = Collections.reverseOrder();
Collections.sort(arrayList, comparator);
【讨论】:
仅在该变量声明中带有泛型参数。【参考方案3】:您可以使用下面给出的以下代码;
Collections.sort(list, Collections.reverseOrder());
或者如果您要使用自定义比较器,您可以使用如下所示
Collections.sort(list, Collections.reverseOrder(new CustomComparator());
其中 CustomComparator 是一个比较器类,用于比较列表中存在的对象。
【讨论】:
【参考方案4】:Java 8
在 java 8 中很好地做到这一点非常有趣和容易
Collections.sort(variants,(a,b)->a.compareTo(b));
Collections.reverse(variants);
Lambda 表达式在这里摇滚!!!
如果您需要多行逻辑来比较 a 和 b,您可以这样写
Collections.sort(variants,(a,b)->
int result = a.compareTo(b);
return result;
);
【讨论】:
我想如果我们把它改成 b.compareTo(a),我们就不需要逆向收集了。 @zawhtut,完全正确!刚刚提到 reverse() 以便您知道选项,选择是您的 需要将long转Long吗?【参考方案5】:正常排序并使用Collections.reverse();
【讨论】:
【参考方案6】:对于我推荐使用的对象中某处的长值的 lamdas:
.sorted((o1, o2) -> Long.compare(o1.getLong(), o2.getLong()))
甚至更好:
.sorted(Comparator.comparingLong(MyObject::getLong))
【讨论】:
【参考方案7】:排序,然后反转。
【讨论】:
【参考方案8】:通过将Collections.sort()
与提供降序的比较器一起使用。
请参阅 Javadoc 获取 Collections.sort。
【讨论】:
【参考方案9】:一种更通用的方法来实现我们自己的比较器,如下所示
Collections.sort(lst,new Comparator<Long>()
public int compare(Long o1, Long o2)
return o2.compareTo(o1);
);
【讨论】:
【参考方案10】:以下方法将按降序对列表进行排序,并处理 '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);
);
【讨论】:
【参考方案11】:您还可以使用TreeSet
而不是comparator
对ArrayList
进行排序。这是我之前对整数数组提出的问题的一个示例。我使用“数字”作为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
不存储重复值。【参考方案12】:
所以,我想提出一些我认为很重要的事情,我认为你应该考虑一下。运行时和内存。假设您有一个列表并想要对其进行排序,那么您可以,有一个内置的排序,或者您可以开发自己的排序。然后你说,想把列表倒过来。这就是上面列出的答案。
如果您正在创建该列表,最好使用不同的数据结构来存储它,然后将其转储到数组中。
堆就是这样做的。您过滤数据,它会处理所有内容,然后您可以从对象中弹出所有内容并对其进行排序。
另一种选择是了解地图的工作原理。很多时候,Map 或 HashMap 作为事物的名称,背后都有一个基本概念。
例如....你输入一堆键值对,其中键是长的,当你添加所有元素时,你可以这样做:.keys
它会返回给你一个排序列表自动。
这取决于你如何处理数据之前我认为你应该如何继续你的排序和随后的逆向
【讨论】:
【参考方案13】:Comparator 的比较方法可以用来比较对象,然后可以使用方法reversed()
来颠倒顺序 -
list.stream().sorted(Comparator.comparing(Employee::getName).reversed()).collect(toList());
【讨论】:
【参考方案14】:使用List.sort()
和Comparator.comparingLong()
numberList.sort(Comparator.comparingLong(x -> -x));
【讨论】:
以上是关于如何按降序对 ArrayList<Long> 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章