1. 程式人生 > >Java的集合排序

Java的集合排序

利用 port 之前 構造器 們的 compare 循環 整體 構造

前言:這幾天碰到了一道算法題和一道面試題,問集合框架怎麽排序的,有點懵逼。


1.比較器接口:

Comparator<T>

    接口 T - 此Comparator可以比較的對象類型

     定義:強行對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法(如 Collections.sortArrays.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;                                        
}

Java的集合排序