2016-04-11 104 views
1

我有一個HashMap帶有以下各項:按鍵排列HashMap?

重點 - 狗對象 價值 - 狗

Map<Dog, List<String>> DogsAndDescriptions; 
說明,我想以通過 HashMap的 「最長壽的狗第一」。

狗是一個Entity具有以下字段,我想通過訂購:

@Column(name = "BIRTHDAY") 
    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime") 
    private DateTime birthday; 

是否可以這樣做呢?

+0

1)獲取地圖2)獲取按鍵3)轉換爲列表4)按年齡排序5)使用此列表中的按鍵。 –

+1

如果您想要訂購按鍵,請使用TreeMap。 – Eran

+0

@Eran可能他是從DB獲取它。不確定。 –

回答

5

這不是真的可能,因爲HashMaps特別是一個無序列表。

您可以使用使用插入順序的java.util.LinkedHashMap,但我認爲您真正想要的是TreeMap,它將支持其中元素的自然排序。

如果你添加一個比較器,吐出最古老的狗,那麼TreeMap會按照你的順序對它們進行排序。

TreeMap是Map接口的實現,因此您可以按照與剛纔相同的方式與它進行交互。

TreeMap<Dog, List<String>> dogsAndDescriptions = new TreeMap<Dog, List<String>>(); 

會實例化你的一個實例(不要大寫你的變量)dogsAndDescriptions Map。你可以做的映像樹構造的部分是通過在Comparator這將決定你的狗是如何被歸類爲鍵,或使狗類擴展相媲美,並重寫compareTo方法基本類似

class Dog implements Comparable<Dog>{ 
    //somecode 

    @Override 
    public int compareTo(Dog o) { 
     return birthday.compareTo(o.birthday); 
    } 
} 

這樣你就可以看到那將根據他們的生日比較狗。我將鏈接到example here作爲比較器如何工作是一個不同的問題,我認爲。但是,這是兩種排序方式。

+0

好的,你能舉個例子嗎?我不熟悉樹形圖數據結構 – java123999

+1

我已經爲你的答案添加了更多的細節。 –

+0

謝謝,林不知道如果我足夠清楚,我正在尋求在地圖上的KEYS而不是其中的值。例如:如果鍵A包含比鍵B更老的狗,則鍵A應該在鍵B之前出現,這可能嗎? – java123999

1

實現你的Dog類實現Comparable<Dog>接口,將主持人Dogbirthday,並使用TreeMap<Dog, List<String>>存儲在它Dog對象。下面是Dog類樣本實現:

class Dog implements Comparable<Dog>{ 
     public Dog(String name, Date dob) { 
      this.name = name; 
      this.birthday = dob; 
     } 

     private String name; 
     private Date birthday; 

     @Override 
     public int compareTo(Dog o) { 
      return birthday.compareTo(o.birthday); 
     } 

     @Override 
     public String toString() { 
      return name; 
     } 
    } 

注:我注意到用於簡化任何額外的註釋。

因爲HashCode不保留任何順序,所以不能使用HashMap來保留Dog密鑰上的某種排序順序。欲瞭解更多信息,請參考:Difference between HashMap, LinkedHashMap and TreeMap