java集合进行排序的两种方式
来源:互联网 发布:法学双学位算法本吗 编辑:程序博客网 时间:2024/06/05 19:37
每周分享几道Java基础面试题并对其中涉及到的知识进行深一步的剖析:
今天分享这样一道的面试题:
Java集合中用哪两种方式来实现集合的排序?
你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。
给出的答案过于简单 于是进一步查资料,想看看这两种;排序的具体实现方法:
java集合的工具类Collections中提供了两种排序的方法,分别是:
- Collections.sort(List list)
- Collections.sort(List list,Comparator c)
第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下:
实体类:(基本属性,getter/setter方法,有参无参构造方法,toString方法)
package test;public class Emp implements Comparable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Emp() { super(); } public Emp(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Emp [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Object o) { if(o instanceof Emp){ Emp emp = (Emp) o;// return this.age-emp.getAge();//按照年龄升序排序 return this.name.compareTo(emp.getName());//换姓名升序排序 } throw new ClassCastException("不能转换为Emp类型的对象..."); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
第二种叫定制排序,或自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法;
然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能;
说明:第一种方法不够灵活,实体类实现了comparable接口后,会增加耦合,如果在项目中不同的位置需要根据不同的属性调用排序方法时,需要反复修改比较规则(按name还是按age),二者只能选择其一,会起冲突.第二种就很好地解决了这个问题.comparator c即为你的自定义比较类,其中有compare方法定义了比较规则。将comparator做为参数传入Collections.sort方法,便可以按照你自定义的规则对List中元素进行排序操作了
jUnit4单元测试类代码如下:
package test;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import org.junit.BeforeClass;import org.junit.Test;public class TestSort { static List list = new ArrayList(); //@BeforeClass注解标注的方法会在其它测试方法执行之前先执行, //且只执行一次.@Before注解标注的方法会在每个测试方法之前执行; //此处初始化集合只需要一次,因此使用@BeforeClass. @BeforeClass public static void init(){ list.add(new Emp("tom",18)); list.add(new Emp("jack",20)); list.add(new Emp("rose",15)); list.add(new Emp("jerry",17)); System.out.println("排序前:"); for(Object o : list){ System.out.println(o); } } /**按age升序排序*/// @Test// public void testSortAge(){// Collections.sort(list);// System.out.println("自然排序按age排序后:");// for(Object o : list){// System.out.println(o);// }// }// /**按name升序排序*/ @Test public void testSortName(){ Collections.sort(list); System.out.println("自然排序按name升序排序后:"); for(Object o : list){ System.out.println(o); } } /**使用Comparator比较器按age升序排序*/ @Test public void testComparatorSortAge(){ Collections.sort(list,new Comparator () { @Override public int compare(Object o1, Object o2) { if(o1 instanceof Emp && o2 instanceof Emp){ Emp e1 = (Emp) o1; Emp e2 = (Emp) o2; return e1.getAge() - e2.getAge(); } throw new ClassCastException("不能转换为Emp类型"); } }); System.out.println("使用Comparator比较器按age升序排序后:"); for(Object o : list){ System.out.println(o); } } /**使用Comparator比较器按name升序排序*/ @Test public void testComparatorSortName(){ Collections.sort(list,new Comparator () { @Override public int compare(Object o1, Object o2) { if(o1 instanceof Emp && o2 instanceof Emp){ Emp e1 = (Emp) o1; Emp e2 = (Emp) o2; return e1.getName().compareTo(e2.getName()); } throw new ClassCastException("不能转换为Emp类型"); } }); System.out.println("使用Comparator比较器按name升序排序后:"); for(Object o : list){ System.out.println(o); } }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
右键空白位置 —> Run As —> JUnit Test —>
运行结果如下:
排序前:Emp [name=tom, age=18]Emp [name=jack, age=20]Emp [name=rose, age=15]Emp [name=jerry, age=17]自然排序按name升序排序后:Emp [name=jack, age=20]Emp [name=jerry, age=17]Emp [name=rose, age=15]Emp [name=tom, age=18]使用Comparator比较器按age升序排序后:Emp [name=rose, age=15]Emp [name=jerry, age=17]Emp [name=tom, age=18]Emp [name=jack, age=20]使用Comparator比较器按name升序排序后:Emp [name=jack, age=20]Emp [name=jerry, age=17]Emp [name=rose, age=15]Emp [name=tom, age=18]
查询的资料来自于博客:http://blog.csdn.net/qgfjeahn/article/details/52573115- java集合进行排序的两种方式
- java集合进行排序的两种方式
- java集合TreeSet的两种排序方式
- 黑马程序员训练营---------TreeSet集合中对象进行排序的两种方式
- Java 数序和集合框架的转化 & Collection.sort()方法排序的两种方式
- java基础 两种方式对int类型的List集合排序
- 黑马程序员_TreeSet集合排序的两种方式
- 集合中自定义对象排序的两种方式
- [Java]HashMap的两种排序方式
- [Java]HashMap的两种排序方式
- [Java]HashMap的两种排序方式
- 【Java】HashMap的两种排序方式
- Java快速排序的两种方式
- TreeSet对元素进行排序实现的两种方式
- 对ArrayList进行排序的两种方式
- TreeSet集合两种排序方式
- JAVA集合中常见的两种去重的两种方式
- Java中Map集合的两种遍历方式
- 【PHP基础知识点】在if满足的情况下,else if会执行吗?
- ubuntu14.04 eclipse C++ 安装(1)
- 0073 spark streaming从端口接受数据进行实时处理的方法
- Ubuntu下sublime支持中文输入
- 参考例7.4,利用求阶乘函数Fact(),编程计算并输出从1到n之间所有数的阶乘值。
- java集合进行排序的两种方式
- 伯克利AI研究院解析「反向课程学习」,改善「强化学习智能体」并应用于机器人技术
- 赛迪发布「Forecast2018」趋势报告,60个行业明年如何发展? | 附PPT
- 机器学习笔记(李宏毅):Regression
- 数据结构实验之查找五:平方之哈希表
- 程序小白的第一天
- 计算平均分
- 算法练习(33):Minimum ASCII Delete Sum for Two Strings
- 左手用R右手Python系列之——表格数据抓取之道