2016-04-11 60 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