前言:这几天碰到了一道算法题和一道面试题,问集合框架怎么排序的,有点懵逼。
1.比较器接口:
Comparator<T>
接口 T - 此Comparator可以比较的对象类型
定义:强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort
或 Arrays.sort
),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set
或有序映射
)的顺序,或者为那些没有自然顺序
的对象 Collection 提供排序。
当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,c.compare(e1, e2)==0 与 e1.equals(e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与 equals 一致 的排序。
通过上面我们可以知道,这个接口说白了就是给集合的元素进行排序。爽歪歪。不用自己写循环循环了。但是我们还是要了解一下它是怎么实现的!!
2.Map 集合类
TreeMap
HashMap实现的接口是Map。大家都知道 Map 集合是一个键值对的集合接口。如果不懂可以点击 Map 。
import java.util.Comparator; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; public class TreeMapTest { public static void main(String[] args) { //利用TreeMap的构造器,进行Comparator构造 Map<String, String> map = new TreeMap<String, String>( new Comparator<String>() { public int compare(String o1, String o2) { //返回两个Map元素对象的键,利用键进行排序 return o1.compareTo(o2); //这样是升序, o2.comparaTo(o1)是降序 }; }); //插入元素 map.put("b", "ccccc"); map.put("d", "aaaaa"); map.put("c", "bbbbb"); map.put("a", "ddddd"); //利用iterator进行遍历 Set<String> keySet = map.keySet(); Iterator<String> it = keySet.iterator(); while (it.hasNext()) { String key = it.next(); System.out.println(key + ":" + map.get(key)); } } }
结果是:
a:ddddd
b:ccccc
c:bbbbb
d:aaaaa
HashMap
HashMap是由哈希映射的,是乱序的。在Api文档中,HashMap并不可以像TreeMap那样通过构造器进行排序。但是,我们可以通过Collections.sort()进行我们的排序。需要注意的是,排序之前我们需要
先把Map转成Collection集合,才能用Collections的方法!
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; public class HashMapTest { public static void main(String[] args) { //初始化 Map<String, String> map = new HashMap<String, String>(); map.put("c", "ccccc"); map.put("a", "aaaaa"); map.put("b", "bbbbb"); map.put("d", "ddddd"); // 利用 Map.Entry接口返回了Collection视图。 List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<String, String>>() { @Override public int compare(Entry<String, String> o1, Entry<String, String> o2) { return o1.getKey().compareTo(o2.getKey()); //根据 键 来进行升序排序。反过来就是降序 } }); } }
拓展: (键值联合排序)
if (o1.getKey().compareTo(o2.getValue()) > 0) { //根据 键 来排序 return 1; }else if(o1.getKey().compareTo(o2.getKey()) == 0){ //如果 键 相等,那么根据 值 来排序 return o1.getValue().compareTo(o2.getValue()); }else{ return -1; }