面试官出的题:
给你一组学生的成绩信息,key 为学生姓名,value 为成绩,然后根据value 进行排序。
说实话,面试官问到我的时候,真的挺崩溃的,自己的算法本来就不好,对这个又不是很熟悉,所以当时很紧张的,不过还好,在面试初期遇到了这些问题,还有的补。
下面我就简要的对map进行简单的介绍和各map排序
A 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 put
, get
, remove
,containsKey
, containsValue
, size
, and empty
), bulk operations (such as putAll
and clear
), and collection views (such as keySet
, entrySet
, and values
).
The Java platform contains three general-purpose Map
implementations: HashMap
, TreeMap
, 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排序实现对它们的排序。
转载于:https://blog.51cto.com/botao900422/1557786