1. 程式人生 > >Java-TreeMap對Key/Value自定排序

Java-TreeMap對Key/Value自定排序

Java-TreeMap對Key/Value自定排序

Key自定義排序:

實現Comparator介面:

1)重寫介面Comparator中的compare方法

//實現介面:Comparator
class MyComparator implements Comparator{
	
	//自定義排序,對價格升序排序
    //例項key為double型別
	public int compare(Object o1,Object o2) {
		double a=(double)o1;
		double b=(double)o2;
		if(a-b>1e-6) {
			return 1;
		}else if(b-a>1e-6) {
			return -1;
		}else {
			return 0;
		}
	}
}

2)建立方法:將原map值搬入定義有排序規則的另一map

    //建立map,key為價格,value為尺寸
	Map<Double,Double> SortByPrice=new TreeMap<>();

    //呼叫重排方法
	SortByPrice=cmp(SortByPrice);

    //map重排方法
	public static Map<Double,Double> cmp(Map<Double,Double> map){
		
		//建立新的map,使用自定義的key排序規則
		Map<Double,Double> Res=new TreeMap<>(new MyComparator());
		Res.putAll(map);	//裝入原先map的資料
		
		return Res;	//返回自定義key排序的map物件
	}

 

實現Comparable介面:

1)將Comparable的子類作為TreeMap的key值,並重寫Comparable中的compareTo方法

Tip:以此為key的map將按重寫的compareTo規則進行排序

//MyKey.java
//實現Comparable介面
class MyKey implements Comparable{
	
	public double Pirce;
	public MyKey(double Price) {
		this.Pirce=Price;
	}
	
	//對Price進行升序排序
	public int compareTo(Object o) {
		MyKey key=(MyKey)o;
		if(key.Pirce-this.Pirce>1e-6) {
			return -1;
		}else if(this.Pirce-key.Pirce>1e-6) {
			return 1;
		}else {
			return 0;
		}
	}
}

總結:

留個坑給自己,第二種方法會不會導致TreeMap中的containsKey方法不能正常使用,是否得重寫equals和compare,過後會有個更新。

 

Value自定義排序:

實現Comparator介面

1)重寫Comparator中的compare方法

    /*自定排序:對單詞出現次數(Value)降序
	 * 重寫compare實現
	 */
	private class SortByValue implements Comparator<Map.Entry<String, Integer>>{
		
		@Override
		public int compare(Entry<String, Integer> l, Entry<String, Integer> r) {
			// TODO Auto-generated method stub
			return r.getValue()-l.getValue();
		}

	}

2)將TreeMap轉為資料型別為Map.Entry的ArraysList,呼叫Collections的sort方法

private TreeMap<String,Integer> Words_Analysis;
private List<Map.Entry<String,Integer>> Result;

/*將map統計的結果以Entry-List形式儲存
 * 呼叫集合類中的Sort方法*/
public void Sort() {
		
	Result.addAll(Words_Analysis.entrySet());
	SortByValue cmp=new SortByValue();
	Collections.sort(Result, cmp);
}

 

上述引用例項的原始碼(GitHub):

對Key自定義排序:

1)實現Comparator介面:對某商品價格的排序

2)實現Comparable介面:對某商品價格的排序

對Value自定義排序:

1)實現Comparator介面:統計本地txt檔案中單詞個數