如何對map中的value進行排序
阿新 • • 發佈:2019-01-05
package com.demo.map;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* map排序
* @author wang
*
*/
public class SortMap {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("nine",9);
map.put("six",6);
map.put("name",6);
map.put("eight",8);
map.put("zero",0);
map.put("one",1);
map.put("four",4);
map.put("two",2);
//根據map中的key值排序
sortMap(map);
}
public static void sortMap(Map<String, Integer> map){
//獲取entrySet
Set<Map.Entry<String,Integer>> mapEntries = map.entrySet();
for(Entry<String, Integer> entry : mapEntries){
System.out.println("key:" +entry.getKey()+" value:"+entry.getValue() );
}
//使用連結串列來對集合進行排序,使用LinkedList,利於插入元素
List<Map.Entry<String, Integer>> result = new LinkedList<>(mapEntries);
//自定義比較器來比較連結串列中的元素
Collections.sort(result, new Comparator<Entry<String, Integer>>() {
//基於entry的值(Entry.getValue()),來排序連結串列
@Override
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()) ;
}
});
//將排好序的存入到LinkedHashMap(可保持順序)中,需要儲存鍵和值資訊對到新的對映中。
Map<String,Integer> linkMap = new LinkedHashMap<>();
for(Entry<String,Integer> newEntry :result){
linkMap.put(newEntry.getKey(), newEntry.getValue());
}
//根據entrySet()方法遍歷linkMap
for(Map.Entry<String, Integer> mapEntry : linkMap.entrySet()){
System.out.println("key:"+mapEntry.getKey()+" value:"+mapEntry.getValue());
}
}
}
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* map排序
* @author wang
*
*/
public class SortMap {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
map.put("nine",9);
map.put("six",6);
map.put("name",6);
map.put("eight",8);
map.put("zero",0);
map.put("one",1);
map.put("four",4);
map.put("two",2);
//根據map中的key值排序
sortMap(map);
}
public static void sortMap(Map<String, Integer> map){
//獲取entrySet
Set<Map.Entry<String,Integer>> mapEntries = map.entrySet();
for(Entry<String, Integer> entry : mapEntries){
System.out.println("key:" +entry.getKey()+" value:"+entry.getValue() );
}
//使用連結串列來對集合進行排序,使用LinkedList,利於插入元素
List<Map.Entry<String, Integer>> result = new LinkedList<>(mapEntries);
//自定義比較器來比較連結串列中的元素
Collections.sort(result, new Comparator<Entry<String, Integer>>() {
//基於entry的值(Entry.getValue()),來排序連結串列
@Override
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o1.getValue().compareTo(o2.getValue()) ;
}
});
//將排好序的存入到LinkedHashMap(可保持順序)中,需要儲存鍵和值資訊對到新的對映中。
Map<String,Integer> linkMap = new LinkedHashMap<>();
for(Entry<String,Integer> newEntry :result){
linkMap.put(newEntry.getKey(), newEntry.getValue());
}
//根據entrySet()方法遍歷linkMap
for(Map.Entry<String, Integer> mapEntry : linkMap.entrySet()){
System.out.println("key:"+mapEntry.getKey()+" value:"+mapEntry.getValue());
}
}
}
結果為:
key:zero value:0
key:one value:1
key:two value:2
key:four value:4
key:six value:6
key:name value:6
key:eight value:8
key:nine value:9
總結,這裡HashMap使用 內部類Entry<K, V>來儲存資料,因此,我們需要對儲存有鍵值對的Entry<K,V>物件進行排序來實現我們的HashMap排序的功能。這裡採用物件排序的方法,將
Entry<K,V>物件放入到List集合中,再使用自定義比較器對LinkedList集合排序。由於HashMap不儲存key-value對,因此採用LinkedHashMap(可保持順序)中,需要儲存鍵和值資訊對到新的對映中。其中要注意的是:Map集合的key是不允許重複的,一單重複等同於覆蓋,我在這裡就犯錯了。