Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例
TreeMap 升序|降序排列
import java.util.Comparator;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
TreeMap<Integer,Integer> map1 = new TreeMap<Integer,Integer>(); //默認(rèn)的TreeMap升序排列
TreeMap<Integer,Integer> map2= new TreeMap<Integer,Integer>(new Comparator<Integer>(){
/*
* int compare(Object o1, Object o2) 返回一個(gè)基本類型的整型,
* 返回負(fù)數(shù)表示:o1 小于o2,
* 返回0 表示:o1和o2相等,
* 返回正數(shù)表示:o1大于o2。
*/
public int compare(Integer a,Integer b){
return b-a;
}
});
map2.put(1,2);
map2.put(2,4);
map2.put(7, 1);
map2.put(5,2);
System.out.println("Map2="+map2);
map1.put(1,2);
map1.put(2,4);
map1.put(7, 1);
map1.put(5,2);
System.out.println("map1="+map1);
}
}
TreeMap按照value進(jìn)行排序
TreeMap底層是根據(jù)紅黑樹的數(shù)據(jù)結(jié)構(gòu)構(gòu)建的,默認(rèn)是根據(jù)key的自然排序來(lái)組織(比如integer的大小,String的字典排序)。所以,TreeMap只能根據(jù)key來(lái)排序,是不能根據(jù)value來(lái)排序的(否則key來(lái)排序根本就不能形成TreeMap)。
今天有個(gè)需求,就是要根據(jù)treeMap中的value排序。所以網(wǎng)上看了一下,大致的思路是把TreeMap的EntrySet轉(zhuǎn)換成list,然后使用Collections.sor排序。
代碼:
public static void sortByValue() {
Map<String,String> map = new TreeMap<String,String>();
map.put("a", "dddd");
map.put("d", "aaaa");
map.put("b", "cccc");
map.put("c", "bbbb");
List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(map.entrySet());
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Entry<String, String> o1, Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
for (Entry<String, String> e: list) {
System.out.println(e.getKey()+":"+e.getValue());
}
}
補(bǔ)充知識(shí):使用比較器對(duì)Treemap按照value進(jìn)行排序
使用比較器對(duì)Treemap按照value進(jìn)行排序(value值只有是string類型時(shí)才適用)
有時(shí)我們需要根據(jù)TreeMap的value來(lái)進(jìn)行排序。對(duì)value排序我們就需要借助于Collections的sort(List list, 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進(jìn)行排序
// Map<String, String> resultMap = sortMapByValue(map); //按Value進(jìn)行排序
for (Map.Entry<String, String> entry : resultMap.entrySet()) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
/**
* 使用 Map按value進(jìn)行排序
* @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());
}
}
方式二
public class TreeMapTest {
public static void main(String[] args) {
Map<String, String> map = new TreeMap<String, String>();
map.put("a", "ddddd");
map.put("c", "bbbbb");
map.put("d", "aaaaa");
map.put("b", "ccccc");
//這里將map.entrySet()轉(zhuǎn)換成list
List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
//然后通過(guò)比較器來(lái)實(shí)現(xiàn)排序
Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
//升序排序
public int compare(Entry<String, String> o1,
Entry<String, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
for(Map.Entry<String,String> mapping:list){
System.out.println(mapping.getKey()+":"+mapping.getValue());
}
}
}
運(yùn)行結(jié)果如下:
d:aaaaa
c:bbbbb
b:ccccc
a:ddddd
以上這篇Java TreeMap升序|降序排列和按照value進(jìn)行排序的案例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA使用Maven創(chuàng)建module出現(xiàn)Ignored?pom.xml問(wèn)題及解決
這篇文章主要介紹了IDEA使用Maven創(chuàng)建module出現(xiàn)Ignored?pom.xml問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
詳解Jenkins 實(shí)現(xiàn)Gitlab事件自動(dòng)觸發(fā)Jenkins構(gòu)建及釘釘消息推送
這篇文章主要介紹了Jenkins 實(shí)現(xiàn)Gitlab事件自動(dòng)觸發(fā)Jenkins構(gòu)建及釘釘消息推送,應(yīng)該會(huì)對(duì)大家學(xué)習(xí)Jenkins有所啟發(fā)2021-04-04
SpringBoot 多線程事務(wù)回滾的實(shí)現(xiàn)
本文是基于springboot的@Async注解開啟多線程,并通過(guò)自定義注解和AOP實(shí)現(xiàn)的多線程事務(wù),避免繁瑣的手動(dòng)提交/回滾事務(wù),感興趣的可以了解一下2024-02-02
解決springcloud集成nacos遇到的問(wèn)題
這篇文章介紹了如何解決springcloud集成nacos遇到的問(wèn)題,文章中有詳細(xì)的代碼示例,需要的朋友可以參考一下2023-04-04
Spring @Primary作用和實(shí)現(xiàn)原理詳解
今天分享一下Spring中的@Primary注解,Primary的意思是主要的,我們?cè)谑褂胹pring的時(shí)候,難免會(huì)定義多個(gè)類型相同的bean,這時(shí)候如果不采取一些方法,那么是無(wú)法正常使用bean的,所以本就給大家介紹Spring @Primary的作用和實(shí)現(xiàn)原理2023-07-07

