面試二 : map 排序

面試官出的題:html

    給你一組學生的成績信息,key 爲學生姓名,value 爲成績,而後根據value 進行排序。java

    說實話,面試官問到個人時候,真的挺崩潰的,本身的算法原本就很差,對這個又不是很熟悉,因此當時很緊張的,不過還好,在面試初期遇到了這些問題,還有的補。面試

    下面我就簡要的對map進行簡單的介紹和各map排序算法

    Map is an object that maps keys to values. A map cannot contain duplicate keys: Each key can map to at most one value.  api

    The Map interface includes methods for basic operations (such as putgetremove,containsKeycontainsValuesize, and empty), bulk operations (such as putAll and clear), and collection views (such as keySetentrySet, and values).數組

    The Java platform contains three general-purpose Map implementations: HashMapTreeMap, and LinkedHashMaporacle


    HashMap:咱們最經常使用的Map,它根據key的HashCode 值來存儲數據,根據key能夠直接獲取它的Value,同時它具備很快的訪問速度。HashMap最多隻容許一條記錄的key值爲Null(多條會覆蓋);容許多條記錄的Value爲 Null。非同步的。
ide

    TreeMap: 可以把它保存的記錄根據key排序,默認是按升序排序,也能夠指定排序的比較器,當用Iterator 遍歷TreeMap時,獲得的記錄是排過序的。TreeMap不容許key的值爲null。非同步的。spa

    LinkedHashMap: 保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先獲得的記錄確定是先插入的.在遍歷的時候會比HashMap慢。key和value均容許爲空,非同步的。線程

    Hashtable: 與 HashMap相似,不一樣的是:key和value的值均不容許爲null;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,所以也致使了Hashtale在寫入時會比較慢。

    下面咱們就看一下個map的排序

     TreeMap默認是升序的,若是咱們須要改變排序方式,則須要使用比較器:Comparator。
Comparator能夠對集合對象或者數組進行排序的比較器接口,實現該接口的public compare(T o1,To2)方法便可實現排序,該方法主要是根據第一個參數o1,小於、等於或者大於o2分別返回負整數、0或者正整數。

package cn.edu.ytu.botao.java.map;

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

/**
 * 因爲treemap 默認是排序的,且是升序的,若是咱們要改變排列方式,可使用比較器: compartor
 * @author botao
 *
 */
public class TreeMapSort {
	
	public static void main(String[] args) {
		//默認的TreeMap
		TreeMap<String, String> treeMap1 = new TreeMap<>();
		
		//建立Treemap對象,實現Compartor接口 
		TreeMap<String, String> treeMap2 = new TreeMap<>(new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				// TODO Auto-generated method stub
				//比較 o1 和 o2 
				return o2.compareTo(o1);
			}
		});
	
		treeMap1.put("c", "cccc");
		treeMap2.put("c", "cccc");
		treeMap1.put("a", "aaaa");
		treeMap2.put("a", "aaaa");
		treeMap1.put("b", "bbbb");
		treeMap2.put("b", "bbbb");
	
		//獲得keyset集合
		Set<String> keySet1 = treeMap1.keySet();
		Set<String> keySet2 = treeMap2.keySet();
	
		//獲得迭代器
		Iterator<String> iterator1 = keySet1.iterator();
		Iterator<String> iterator2 = keySet2.iterator();
		//默認順序輸出
		while (iterator1.hasNext()) {
			String key = (String) iterator1.next();
			System.out.println(key + " : " + treeMap1.get(key));
		}
	
		//咱們實現了compartor , 改變默認排序
		while (iterator2.hasNext()) {
			String key = (String) iterator2.next();
			System.out.println(key + " :: " + treeMap2.get(key));
		}
	}
	
}

輸出結果:

a : aaaa

b : bbbb

c : cccc

c :: cccc

b :: bbbb

a :: aaaa



上面的例子對根據TreeMap的key值來進行排序的,可是咱們的需求是據TreeMap的value來進行排序。對value排序咱們就須要藉助於Collections的sort(List<T> list, Comparator<? super T> c)方法,該方法根據指定比較器產生的順序對指定列表進行排序

示例

package cn.edu.ytu.botao.java.map;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

/**
 * TreeMap 默認是對key進行排序 如今是根據value進行排序
 * @author botao
 *
 */
public class TreeMapSortByValue {
	
	public static void main(String[] args) {
		//先建立TreeMap對象
		TreeMap<String, String> treeMap = new TreeMap<>();
		//填充map
		treeMap.put("c", "cccc");
		treeMap.put("a", "aaaa");
		treeMap.put("b", "bbbb");
		//將map轉化爲 list
		List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(treeMap.entrySet());
		//經過比較器對list進行排序
		Collections.sort(list, new Comparator<Map.Entry<String, String>>() {

			@Override
			public int compare(Entry<String, String> o1,
					Entry<String, String> o2) {
				// TODO Auto-generated method stub
				return o1.getValue().compareTo(o2.getValue());
			}
			
		});
		
		//對結果進行輸出
		for (Entry<String, String> entry : list) {
			System.out.println(entry.getKey() + " : " + entry.getValue());
		}
		
	}
	
}

輸出結果:

a : aaaa

b : bbbb

c : cccc

HashMap 默認是不排序的,因此咱們能夠參照咱們上面TreeMap的value排序實現對它們的排序。 

相關文章
相關標籤/搜索