我的关注 |
¥0.1 java中list的sort()功能如何使用?如果倒序如何正序?
0

java中list的sort()功能如何使用?如果倒序如何正序?

佛法不二
修改
评论(0)
3个回答
1
采纳

在java8以前,list是没有sort()这个方法的。

如果需要对list进行排序可以把list转化为数组。

在Java8中,接口加入了默认方法。而List的sort就是这样一个默认方法。

  1. default void sort(Comparator<? super E> c) {
  2. Object[] a = this.toArray();
  3. Arrays.sort(a, (Comparator) c);
  4. ListIterator<E> i = this.listIterator();
  5. for (Object e : a) {
  6. i.next();
  7. i.set((E) e);
  8. }
  9. }

从源码中可以看出,该方法的原理实际上还是将List转化为了数组,再对数组进行排序。

该方法接收一个Comparator参数。

如果list里面放的类型实现了Comparable接口

那么可以这样调用

  1. List<Integer> list = IntStream.of(10,4,50,34,56,234,22,665,78,54,53).collect(ArrayList::new, List::add,
  2. List::addAll);
  3. list.sort(Integer::compareTo);

如果是普通的类型

  1. public class Test {
  2. public static void main(String[] args) {
  3. List<NormalClass> list = new ArrayList<>();
  4. for (int i = 0; i < 10; i++) {
  5. list.add(NormalClass.getRandom());
  6. }
  7. list.sort(Test::compare);
  8. }
  9. static int compare(NormalClass n1, NormalClass n2) {
  10. if (n1.a == n2.a) {
  11. return n1.b - n2.b;
  12. }
  13. return n1.a - n2.a;
  14. }
  15. }
  16. class NormalClass {
  17. int a;
  18. int b;
  19. static NormalClass getRandom() {
  20. Random random = new Random();
  21. NormalClass n = new NormalClass();
  22. n.a = random.nextInt();
  23. n.b = random.nextInt();
  24. return n;
  25. }
  26. }
采纳答案
很二很温柔
修改
评论 (0)
0
采纳

list.sort()接收一个Comparable接口,其中compare方法是必须实现的,int compare(T o1, T o2);,它接受两个参数:o1,o2. o2表示list排序前的前值,o1为后值,compare对他们通过比较进行排序。compare如果返回1则表示o1在后,o2在前(等价于位置不变);返回-1表示o1在前o2在后(等价置换o1与o2的位置);返回0表示位置不变
可以使用lambda表达式进行从小到大排序:

  1. public static void main(String[] args) {
  2. List<Integer> list = new ArrayList<>();
  3. Random random = new Random();
  4. for (int i = 0; i < 10; i++) {
  5. list.add(random.nextInt(100));
  6. }
  7. // 从小到大排序
  8. list.sort((o1, o2) -> {
  9. if (o1.equals(o2)) {
  10. return 0;
  11. } else if (o1 > o2) {
  12. //o2为前值,o1为后值;这里理解为:后值比前值大,则不交换位置,等价从小到大排序
  13. //如果这里返回 -1,则为从大到小排序
  14. return 1;
  15. } else {
  16. //后值比前值小,则交换位置
  17. return -1;
  18. }
  19. });
  20. list.forEach(e -> System.out.print(e + " "));
  21. }

如果需要从大到小排序,只需要将代码中 return 1改成return -1, return -1改成return 0即可.

采纳答案
hong
修改
评论 (0)
0
采纳

排序时正序/倒序处理起来可能会混淆,可以用更简单的方法。
可以使用java.util自带的比较器来做

  1. Comparator.comparingInt(Integer::intValue).reversed() // 倒序
  2. Comparator.comparingInt(Integer::intValue) // 正序

示例:

  1. public class Main {
  2. public static void main(String[] args) {
  3. List<Integer> list = Lists.newArrayList(1, 2, 3);
  4. list.sort(Comparator.comparingInt(Integer::intValue).reversed()); // 倒序
  5. print(list);
  6. list.sort(Comparator.comparingInt(Integer::intValue)); // 默认正序
  7. print(list);
  8. List<Integer> list2 = Lists.newArrayList(1, 2, 3);
  9. list2 = list2.stream().sorted(Comparator.comparingInt(Integer::intValue).reversed())
  10. .collect(Collectors.toList()); // 倒序
  11. print(list2);
  12. list2 = list2.stream().sorted(Comparator.comparingInt(Integer::intValue))
  13. .collect(Collectors.toList()); // 默认正序
  14. print(list2);
  15. }
  16. /**
  17. * 输出
  18. */
  19. private static <T> void print(List<T> list) {
  20. list.forEach(e -> System.out.print(e + ","));
  21. System.out.println();
  22. }
  23. }

上面代码执行输出为:

  1. 3,2,1,
  2. 1,2,3,
  3. 3,2,1,
  4. 1,2,3,

对于复杂对象,比如User,想通过年龄来比较

  1. public class User {
  2. public String name; // 姓名
  3. public int age; // 年龄
  4. public int getAge() {
  5. return age;
  6. }
  7. }

可以使用:

  1. Comparator.comparingInt(User::getAge).reversed() // 倒序
  2. Comparator.comparingInt(User::getAge) // 正序
采纳答案
hong
修改
评论 (0)
撰写回答