2015-08-26 45 views
0

我有一個結構,它是一個Map,其中包含對:String=>Map。 有沒有一種方法來排序這個地圖(根)多個值?實施例是清楚的:按價值中的多個字段排序地圖(地圖作爲值)

輸入:

"A" => {name: "John", age: "47"} 
"B" => {name: "Sam", age: "60"} 
"C" => {name: "Josh", age: "30"} 
"D" => {name: "Tom", age: "15"} 
"E" => {name: "Josh", age: "31"} 

排序:

//group 1 
"A" => {name: "John", age: "47"} 
//group2 
"C" => {name: "Josh", age: "30"} 
"E" => {name: "Josh", age: "31"} 
//group3 
"B" => {name: "Sam", age: "60"} 
//group4 
"D" => {name: "Tom", age: "15"} 

輸出地圖排序由name第一,通過age然後(排序的組內)。 我可以通過單個地圖值條目進行排序,但是我無法找到一個簡單(偏)的方式來按多個條目排序(按給定順序)。我可以嘗試在每種排序之後拆分這個結構,應用下一級排序並在最後加入所有內容,但我正在尋找更多奇特的解決方案(如果有的話)。

任何想法?

+1

使用'collections.sort'和一個'Comparator >' –

+0

如果我明白你有'Map >'。使用自定義類代替內部映射比如'Map ' – Simon

回答

2

Java提供了一個TreeMap,它允許您指定一個比較器,在該比較器中它將對輸入進行排序。

要以傳統方式使用TreeMap,你需要做一些事情,像這樣:

private class Person implements Comparable<Person>{ 
    private String name; 
    private int age; 

    public Person(String name, int age) { 
     this.name = name; 
     this.age = age; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public int getAge() { 
     return this.age; 
    } 

    @Override 
    public int compareTo(Person t) { 
     if(!this.getName().equals(t.getName())) 
      return this.getName().compareTo(t.getName()); 

     return Integer.compare(this.getAge(), t.getAge()); 
    } 
} 

private class CustomComparator implements Comparator<Person> { 
    @Override 
    public int compare(Person p1, Person p2) { 
     return p1.compareTo(p2); 
    } 
} 

public NewClass() 
{ 
    SortedMap<Person, String> map = new TreeMap<Person, String>(new CustomComparator()); 

} 

所以基本上你將需要交換的關鍵和值對。如果這不是你所追求的,那麼你可以看看this之前的SO問題以獲得更多答案。

+0

這可能是有利的嗎?這是否使得'Map'實現特定? –

+2

@ReutSharabani:如果你使用'TreeMap'是的,因爲你將使用一個具體的類。如果您想要使用接口,那麼您可以使用['SortedMap'](https://docs.oracle.com/javase/8/docs/api/java/util/SortedMap.html)編寫代碼。 – npinti

+0

我想避免使用單獨的課程,但我想這很簡單。謝謝! –