Collections的集合类包含了排序方法 void sort(List<T> list)但是只能对List进行排序
List
ArrayList是按照添加顺序存储的
LinkedList也是按照添加顺序存储的
①对List进行正常排序
List<String> list = new ArrayList<String>(); list.add("12"); list.add("4"); list.add("23"); //Collections.sort(list); Collections.sort(list, new Comparator<String>() { @Override public int compare(String o1, String o2) { int x1 = Integer.parseInt(o1); int x2 = Integer.parseInt(o2); return x1>x2?1:(x1==x2?0:-1); } }); for(String info : list){ System.out.println(info); }
String类底层实现了Comparable接口,所以默认sort()排序是升序排列的。
如果排序规则不满足需求,需要使用sort(List<T> list, Comparator<? super T> c)构造器自己来实现排序规则(如上代码)
②List<Object>泛型为自定义对象时
可以通过上面方式外部实现排序接口Comparator
也可以在自定义对象中事先内部排序接口Comparable
package com.sunyuqian.test; public class Person implements Comparable<Person>{ 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; } @Override public int compareTo(Person o) { return (o.getAge()<this.age)?1:((o.getAge()==this.age)?0:-1); } public Person(String name, int age) { this.name = name; this.age = age; } }
//通过实体类实现comparable接口来实现内部排序 Person a = new Person("张三",23); Person b = new Person("王五",43); Person c = new Person("李四",12); List<Person> plist = new ArrayList<Person>(); plist.add(a); plist.add(b); plist.add(c); Collections.sort(plist); for(Person info : plist){ System.out.println(info.getName()+"--------"+info.getAge()); }
set
HashSet是无序的
LinkedHashSet按照添加顺序访问
TreeSet是可以对set集合进行自定义排序的
//Set<String>的泛型是基本类型时,默认实现了Comparable接口 //默认是按升序排列的 Set<String> treeSet = new TreeSet<String>(); treeSet.add("18"); treeSet.add("4"); treeSet.add("2"); treeSet.add("16"); treeSet.add("18"); treeSet.add("23"); for(String info : treeSet){ System.out.println(info); } //如果不想按升序进行排序,就需要使用TreeSet(Comparator<? super E> comparator)的构造器,自己重新编写排序规则 //set降序输出 Set<String> treeSet = new TreeSet<String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); treeSet.add("18"); treeSet.add("4"); treeSet.add("2"); treeSet.add("16"); treeSet.add("18"); treeSet.add("23"); for(String info : treeSet){ System.out.println(info); } //如何泛型不是基本数据类型的包装类,而是自定义的对象,需要自定义的对象实现Comparable接口或者TreeSet实现外部接口
TreeSet是可以实现Comparator排序接口进行自定义排序规则的。如果不实现该接口默认是按泛型的本身自带的规则进行排序的。
二、Map集合排序:
HashMap无序的
LinkedHashMap按照添加顺序存储的
TreeMap可以实现外部排序接口,默认升序
如果不使用TreeMap需要对HashMap进行排序,可以把Map放到List中使用Collections工具类对HashMap进行key排序或value排序
Map<String,String> map = new HashMap<String, String>(); map.put("1", "ccccccccc"); map.put("4", "aaaaaaaaa"); map.put("2", "ddddddddd"); map.put("3", "bbbbbbbbb"); List<Map.Entry<String,String>> mapList = new ArrayList<Map.Entry<String,String>>(map.entrySet()); Collections.sort(mapList, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Entry<String, String> o1, Entry<String, String> o2) { return o1.getKey().compareTo(o2.getKey()); } }); for(Map.Entry<String, String> info : mapList){ System.out.println(info.getKey()+"--------"+info.getValue()); }
三、Comparable与Comparator区别
Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。