Java-TreeMap對Key/Value自定排序
阿新 • • 發佈:2018-11-19
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檔案中單詞個數