天天看點

java map集合排序的_Java對Map集合進行排序

Java對Map集合進行排序

實作 Comparator 接口,重寫compare方法,完成自定義排序

int compare(Object o1, Object o2) 傳回一個基本類型的整型

如果要按照升序排序,則o1 小于o2,傳回-1(負數),相等傳回0,01大于02傳回1(正數)

如果要按照降序排序,則o1 小于o2,傳回1(正數),相等傳回0,01大于02傳回-1(負數)

使用示例如下:

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

public class MapSort {

public static void main(String[] args) {

sortMap();//測試Map排序

}

public static Map sortMap(){

Map map = new HashMap();

map.put("100M",(double) 100);

map.put("10M",(double) 10);

map.put("1000G",(double) 1000000);

map.put("10G",(double) 10000);

map.put("100T",(double) 100000000);

map.put("10T",(double) 10000000);

map.put("1T",(double) 1000000);

//将map添加到list

List> list = new ArrayList>(map.entrySet());

System.out.println("排序前:"+list);

Collections.sort(list,new Comparator>() {

//從大到小

@Override

public int compare(Entry o1, Entry o2) {

if(o1.getValue()>o2.getValue()){

return -1;

}else if(o1.getValue().equals(o2.getValue())){

String str1 = o1.getKey().substring(o1.getKey().length()-1, o1.getKey().length());

String str2 = o2.getKey().substring(o2.getKey().length()-1, o2.getKey().length());

//因為定義的是Double包裝類型,在比較的時候需要用 equals才能判斷相等,使用==比較的是對象的位址

if(str1.equals(str2)){

return 0;

//數值相同時,比較的是機關,機關從大到小排序 T>G>M

}else if((str1.equals("T") && str2.equals("G")) ||( str1.equals("T") && str2.equals("M") )||( str1.equals("G") && str2.equals("M"))){

return -1;

}else{

return 1;

}

}else{

return 1;

}

}

});

System.out.println("排序後(從大到小):"+list);

return map;

}

}

執行結果:

排序前:[1000G=1000000.0, 1T=1000000.0, 100T=1.0E8, 10T=1.0E7, 10G=10000.0, 100M=100.0, 10M=10.0]

排序後(從大到小):[100T=1.0E8, 10T=1.0E7, 1T=1000000.0, 1000G=1000000.0, 10G=10000.0, 100M=100.0, 10M=10.0]

實際應用

場景描述:100w+條資料插入資料庫,需要分批插入(每次插入200000條資料為準)

private List> getStartEndLimits(Integer sumNumbers){

if(sumNumbers <= 0 ){return null;}//如果為0 則傳回null

int len = sumNumbers/200000 +1;

int modlen = sumNumbers%200000 ;

int start = 0;

int end = 200000;

List> limitList = new ArrayList>();

//因資料量過大,需要分批插入(每200000條資料作為1批資料)

len = sumNumbers/200000 +1;

modlen = sumNumbers%200000 ;

start = 0;

end = 200000;

if(sumNumbers < 200000){end=sumNumbers;} //如果總數量小于20w則不需要分批插入

for(int i=0;i

Map limitMaps = new HashMap();

limitMaps.put("start",start);

limitMaps.put("end",end);

limitMaps.put("seqid", i);

limitList.add(limitMaps);

if(i==(len-2)){

end =modlen;

}

start +=200000;

}

// 從小到大排序

Collections.sort(limitList,new Comparator>(){

@Override

public int compare(Map map1, Map map2) {

if( map1.get("seqid") > map2.get("seqid")){

return 1;

}

return -1;

}

});

return limitList;

}

調用示例:

private static Integer insertContactsOnelifetmp5(){

long starttime = System.currentTimeMillis();

//查詢出資料量,再根據資料量分批插入資料庫中

Integer tmp5nums = 1090023; // contactAgentMapper.getContactsOnelifetmp3nums();這裡執行查詢整體資料量的方法

System.out.println("查詢資料量耗時:"+(System.currentTimeMillis()-starttime)/1000 +"s");

List> limitList = getStartEndLimits(tmp5nums);

if(limitList != null){

for(Map limitListObj : limitList){

System.out.println("limitListObj:"+limitListObj);

// contactAgentMapper.insertContactsOnelifetmp3(limitListObj.get("start"),limitListObj.get("end")); 實際調用示例,這裡擷取開始下标及插入條數資訊 執行插入

}

}

return tmp5nums;

}

執行結果:

limitListObj:{start=0, end=200000, seqid=0}

limitListObj:{start=200000, end=200000, seqid=1}

limitListObj:{start=400000, end=200000, seqid=2}

limitListObj:{start=600000, end=200000, seqid=3}

limitListObj:{start=800000, end=200000, seqid=4}

limitListObj:{start=1000000, end=90023, seqid=5}