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<String,Double> sortMap(){
		Map<String,Double> map = new HashMap<String,Double>();
		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<Map.Entry<String,Double>> list = new ArrayList<Map.Entry<String,Double>>(map.entrySet());
	   System.out.println("排序前:"+list);
           Collections.sort(list,new Comparator<Map.Entry<String,Double>>() {
            //從大到小
			@Override
			public int compare(Entry<String, Double> o1, Entry<String, Double> 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條數據為准)

   /**
     * 返回數據分頁結果信息(用於分批插入數據到數據庫中-數據量過大時)
     * @param sumNumbers  總條數
     * @return 分頁結果list(seqid排序標識 從小到大,start 開始位置,end 插入條數)
     */
    private  List<Map<String,Integer>> 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<Map<String,Integer>> limitList = new ArrayList<Map<String,Integer>>();

        //因數據量過大,需要分批插入(每200000條數據作為1批數據)
        len = sumNumbers/200000 +1;
        modlen = sumNumbers%200000 ;
        start = 0;
        end = 200000;
        if(sumNumbers < 200000){end=sumNumbers;} //如果總數量小於20w則不需要分批插入
        for(int i=0;i<len;i++){
            Map<String,Integer>  limitMaps = new HashMap<String ,Integer>();
            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<Map<String,Integer>>(){
            @Override
            public int compare(Map<String,Integer> map1, Map<String,Integer> 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<Map<String,Integer>>  limitList = getStartEndLimits(tmp5nums);
	        if(limitList != null){
	            for(Map<String,Integer> 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}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM