Java的集合排序
阿新 • • 發佈:2017-09-10
利用 port 之前 構造器 們的 compare 循環 整體 構造
前言:這幾天碰到了一道算法題和一道面試題,問集合框架怎麽排序的,有點懵逼。
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元素對象的鍵,利用鍵進行排序 returno1.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; }
Java的集合排序