当前位置:   article > 正文

Java 集合排序---常用的2种排序方式、附代码实例(大师兄亲测)_集合排序java

集合排序java

Java API针对集合类型排序提供了两种支持:
java.util.Collections.sort(java.util.List)
java.util.Collections.sort(java.util.List, java.util.Comparator)

第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。

第二个方法要求实现一个java.util.Comparator接口。

下面给出测试代码,然后代码的概述如下:(不要看到一百多行代码,就给你吓跑啦哈。大师兄辛辛苦苦测试的呢)

主要是给
(1.)Person类的实例集合按age和name排序,有升有降。
这个是按照第二个方法排序,单独实现一个比较器,然后调用Collections.sort()排序
(2.)Car类的实例集合按price排序,升序排列。

然后,实现代码如下:

  1. import com.google.common.collect.Lists;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. /**
  6. * Created by lxk on 2016/8/31
  7. */
  8. class Person {
  9. private int age;
  10. private String name;
  11. Person(int age, String name) {
  12. this.age = age;
  13. this.name = name;
  14. }
  15. public int getAge() {
  16. return age;
  17. }
  18. public void setAge(int age) {
  19. this.age = age;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. @Override
  28. public String toString() {
  29. return "Person{" +
  30. "age=" + age +
  31. ", name='" + name + '\'' +
  32. '}';
  33. }
  34. }
  35. class PersonByAge implements Comparator<Person> {
  36. @Override
  37. public int compare(Person o1, Person o2) {
  38. //这可以修改来升序或者降序
  39. //return o2.getAge() - o1.getAge();//降序
  40. return o1.getAge() - o2.getAge();//升序
  41. }
  42. }
  43. class PersonByName implements Comparator<Person> {
  44. @Override
  45. public int compare(Person o1, Person o2) {
  46. //这可以修改来升序或者降序
  47. //return o2.getName().compareTo(o1.getName());//降序
  48. return o1.getName().compareTo(o2.getName());//升序
  49. }
  50. }
  51. class Car implements Comparable<Car> {
  52. private String sign;
  53. private int price;
  54. public Car(String sign, int price) {
  55. this.sign = sign;
  56. this.price = price;
  57. }
  58. public String getSign() {
  59. return sign;
  60. }
  61. public void setSign(String sign) {
  62. this.sign = sign;
  63. }
  64. public int getPrice() {
  65. return price;
  66. }
  67. public void setPrice(int price) {
  68. this.price = price;
  69. }
  70. @Override
  71. public int compareTo(Car o) {
  72. //同理也可以根据sign属性排序,就不举例啦。
  73. return this.getPrice() - o.getPrice();
  74. }
  75. @Override
  76. public String toString() {
  77. return "Car{" +
  78. "sign='" + sign + '\'' +
  79. ", price=" + price +
  80. '}';
  81. }
  82. }
  83. class Cmshome {
  84. public static void main(String[] args) {
  85. System.out.println("Person 集合:第二个方法要求实现一个java.util.Comparator接口。");
  86. Person p1 = new Person(11, "adf");
  87. Person p2 = new Person(99, "ggf");
  88. Person p3 = new Person(21, "444");
  89. Person p4 = new Person(15, "yrf");
  90. //集合初始化的时候,若大小可知,应初始化固定大小的集合,也是个好习惯。
  91. List<Person> persons = Lists.newArrayListWithCapacity(4);
  92. persons.add(p1);
  93. persons.add(p2);
  94. persons.add(p3);
  95. persons.add(p4);
  96. //注释是因为这个产生的列表有序啦。
  97. //代码里面有很多的空行是为了把不同功能的代码段分开,良好的编码习惯。
  98. // 写完代码记得格式化一下,也是习惯。
  99. //每个方法每个类都得带Java doc文档注释也是好习惯,当然我就不加了,提醒一下读者的你。
  100. //for (int i = 0; i < 4; i++) {
  101. // persons.add(new Person(i, "cms" + i));
  102. //}
  103. System.out.println("persons原来的默认顺序如下:");
  104. for (Person p : persons) {
  105. System.out.println(p.toString());
  106. }
  107. System.out.println("------下面按 age int 类型排序-----升序-------");
  108. Comparator<Person> ascComparatorByAge = new PersonByAge();
  109. Collections.sort(persons, ascComparatorByAge);
  110. for (Person p : persons) {
  111. System.out.println(p.toString());
  112. }
  113. System.out.println("-------下面按 name string类型排序----Java升序-------");
  114. Comparator<Person> ascComparatorByName = new PersonByName();
  115. Collections.sort(persons, ascComparatorByName);
  116. for (Person p : persons) {
  117. System.out.println(p.toString());
  118. }
  119. System.out.println("Car 集合:第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。");
  120. Car car1 = new Car("ben", 1000);
  121. Car car2 = new Car("qqq", 1);
  122. Car car3 = new Car("bmw", 10000);
  123. Car car4 = new Car("wow", 100);
  124. List<Car> cars = Lists.newArrayListWithCapacity(4);
  125. cars.add(car1);
  126. cars.add(car2);
  127. cars.add(car3);
  128. cars.add(car4);
  129. System.out.println("cars原来的默认顺序如下:");
  130. for (Car car : cars) {
  131. System.out.println(car.toString());
  132. }
  133. System.out.println("------下面按 price int 类型排序--升序----------");
  134. Collections.sort(cars);
  135. for (Car car : cars) {
  136. System.out.println(car.toString());
  137. }
  138. }
  139. }

然后是上述代码的执行结果,如下:

  1. //测试结果如下:
  2. "C:\Program Files\Java\jdk1.8.0_73\bin\java"
  3. Person 集合:第二个方法要求实现一个java.util.Comparator接口。
  4. persons原来的默认顺序如下:
  5. Person{age=11, name='adf'}
  6. Person{age=99, name='ggf'}
  7. Person{age=21, name='444'}
  8. Person{age=15, name='yrf'}
  9. ------下面按 age int 类型排序-----升序-------
  10. Person{age=11, name='adf'}
  11. Person{age=15, name='yrf'}
  12. Person{age=21, name='444'}
  13. Person{age=99, name='ggf'}
  14. -------下面按 name string类型排序----Java升序-------
  15. Person{age=21, name='444'}
  16. Person{age=11, name='adf'}
  17. Person{age=99, name='ggf'}
  18. Person{age=15, name='yrf'}
  19. Car 集合:第一个方法要求所排序的元素类必须实现java.lang.Comparable接口。
  20. cars原来的默认顺序如下:
  21. Car{sign='ben', price=1000}
  22. Car{sign='qqq', price=1}
  23. Car{sign='bmw', price=10000}
  24. Car{sign='wow', price=100}
  25. ------下面按 price int 类型排序--升序----------
  26. Car{sign='qqq', price=1}
  27. Car{sign='wow', price=100}
  28. Car{sign='ben', price=1000}
  29. Car{sign='bmw', price=10000}
  30. Process finished with exit code 0

再然后就是若要是按照字母表去排序的话可以参考如下链接:

汉字按字母表排序的解决方案

还有个问题,你还不一定遇得到,但是还是建议看一下。如下链接:

有时候你觉得你的代码没问题,但是运行的时候,就异常啦。因为排序对象属性可能都是null,上面代码没考虑这个

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/440115
推荐阅读
相关标签
  

闽ICP备14008679号