Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。
1、按键排序
jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator) 传入我们自定义的比较器即可实现按键排序。
实现代码
-
public
class MapSortDemo {
-
-
public
static
void main(
String[] args) {
-
-
Map<
String,
String> map =
new TreeMap<
String,
String>();
-
-
map.put(
"KFC",
"kfc");
-
map.put(
"WNBA",
"wnba");
-
map.put(
"NBA",
"nba");
-
map.put(
"CBA",
"cba");
-
-
Map<
String,
String> resultMap = sortMapByKey(map);
//按Key进行排序
-
-
for (
Map.Entry<
String,
String> entry : resultMap.entrySet()) {
-
System.out.println(entry.getKey() +
" " + entry.getValue());
-
}
-
}
-
-
/**
-
* 使用 Map按key进行排序
-
* @param map
-
* @return
-
*/
-
public
static
Map<
String,
String> sortMapByKey(
Map<
String,
String> map) {
-
if (map ==
null || map.isEmpty()) {
-
return
null;
-
}
-
-
Map<
String,
String> sortMap =
new TreeMap<
String,
String>(
-
new MapKeyComparator());
-
-
sortMap.putAll(map);
-
-
return sortMap;
-
}
-
}
比较器类
-
class MapKeyComparator implements Comparator<String>{
-
-
@Override
-
public int compare(String str1, String str2) {
-
-
return str1.compareTo(str2);
-
}
-
}
2、按值排序
按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。
原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List<T> list, Comparator<? super T> c)
来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次装入Map,为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用了LinkedHashMap数据类型。
实现代码
-
public
class MapSortDemo {
-
-
public
static
void main(
String[] args) {
-
-
Map<
String,
String> map =
new TreeMap<
String,
String>();
-
-
map.put(
"KFC",
"kfc");
-
map.put(
"WNBA",
"wnba");
-
map.put(
"NBA",
"nba");
-
map.put(
"CBA",
"cba");
-
-
Map<
String,
String> resultMap = sortMapByKey(map);
//按Key进行排序
-
// Map<String, String> resultMap = sortMapByValue(map); //按Value进行排序
-
-
for (
Map.Entry<
String,
String> entry : resultMap.entrySet()) {
-
System.out.println(entry.getKey() +
" " + entry.getValue());
-
}
-
}
-
-
/**
-
* 使用 Map按value进行排序
-
* @param map
-
* @return
-
*/
-
public
static
Map<
String,
String> sortMapByValue(
Map<
String,
String> oriMap) {
-
if (oriMap ==
null || oriMap.isEmpty()) {
-
return
null;
-
}
-
Map<
String,
String> sortedMap =
new LinkedHashMap<
String,
String>();
-
List<
Map.Entry<
String,
String>> entryList =
new ArrayList<
Map.Entry<
String,
String>>(
-
oriMap.entrySet());
-
Collections.sort(entryList,
new MapValueComparator());
-
-
Iterator<
Map.Entry<
String,
String>> iter = entryList.iterator();
-
Map.Entry<
String,
String> tmpEntry =
null;
-
while (iter.hasNext()) {
-
tmpEntry = iter.next();
-
sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
-
}
-
return sortedMap;
-
}
-
}
比较器类
-
class MapValueComparator implements Comparator<Map.Entry<String, String>> {
-
-
@Override
-
public int compare(Entry<String, String> me1, Entry<String, String> me2) {
-
-
return me1.getValue().compareTo(me2.getValue());
-
}
-
}