面试官出的题:

    给你一组学生的成绩信息,key 为学生姓名,value 为成绩,然后根据value 进行排序。

    说实话,面试官问到我的时候,真的挺崩溃的,自己的算法本来就不好,对这个又不是很熟悉,所以当时很紧张的,不过还好,在面试初期遇到了这些问题,还有的补。

    下面我就简要的对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.  

    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 LinkedHashMap


    HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度。HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null。非同步的。

    TreeMap: 能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。非同步的。

    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排序实现对它们的排序。