【问题标题】:Ordering a HashMap by Key?按键排序HashMap?
【发布时间】:2023-03-17 16:54:01
【问题描述】:

我有一个HashMap,其中包含以下条目:

Key- 狗对象 价值- 狗的描述

Map<Dog, List<String>> DogsAndDescriptions;

我想按“Oldest Dog First”订购 HashMap。

Dog 是一个 Entity,我希望通过以下字段对其进行排序:

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

可以吗?

【问题讨论】:

  • 1) 获取您的地图 2) 获取密钥集 3) 转换为列表 4) 按年龄排序 5) 使用此列表中的密钥。
  • 如果您希望按键排序,请使用 TreeMap。
  • @Eran 可能他是从 DB 获得的。不确定。
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 你能举个例子吗?

标签: java spring hashmap entity


【解决方案1】:

这实际上是不可能的,因为 HashMaps 特别是一个无序列表。

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

如果您添加一个比较器,它会吐出最老的狗,然后 TreeMap 会按照您的顺序对它们进行排序。

TreeMap 是Map 接口的实现,因此您与它的交互方式与刚才相同。

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

将实例化您的(不要大写您的变量)dogsAndDescriptions Map 的实例。作为 TreeMap 构造函数的一部分,您可以做的是传入 Comparator,它将控制您的狗如何作为键排序,或者使 Dog 类扩展 Comparable 并覆盖 compareTo 方法,基本上类似于

class Dog implements Comparable<Dog>{
    //somecode

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

所以你可以看到它会根据狗的生日来比较狗。我将链接到example here,因为我认为比较器的工作方式是一个不同的问题。但这是对它们进行排序的两种方法。

【讨论】:

  • 好的,你能举个例子吗?我对树形图数据结构不熟悉
  • 我已经为您的回答添加了更多细节。
  • 谢谢,我不确定如果我足够清楚,我希望在地图中订购 KEYS 而不是其中的值。例如:如果钥匙 A 包含比钥匙 B 更老的狗,钥匙 A 应该在钥匙 B 之前,这可能吗?
  • 好的,谢谢,所以当我初始化树形图时,它们已经被订购了?
  • 我已经实现了您的解决方案,但是当我运行时出现错误:“Kennel 无法转换为 java.lang.Comparable”?我已经在 Dog 类中实现了类似的接口,我在 Kennel 中也需要它吗?
【解决方案2】:

在您的Dog 类中实现Comparable&lt;Dog&gt; 接口,该接口将执行Dogbirthday 并使用TreeMap&lt;Dog, List&lt;String&gt;&gt; 在其中存储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;
        }
    }

注意:为了简单起见,我已经注意到使用了任何额外的注释。

您不能使用HashMap 保留Dog 键上的某种排序顺序,因为HashCode 不保留任何顺序。更多信息请参考:Difference between HashMap, LinkedHashMap and TreeMap

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多