【问题标题】:A hash Map in which on of the value object's fields is the key?一个哈希映射,其中值对象的字段是键?
【发布时间】:2011-10-27 18:42:21
【问题描述】:

我想知道是否有像 HashMap 这样的类,其中键是对象中的标识字段。

如果没有,我正在考虑让我用作值的类实现 Map.Entry。这看起来是一种合理的方法还是看起来很危险? (我会让我的关键字段不可变。)

【问题讨论】:

  • 你的对象是什么样子的?
  • 为什么需要一张特殊的地图?创建一个类V,给它一个成员字段K,并创建一个Map<K,V>
  • 再想一想,我让值实现 Map.Entry 的概念是不可行的,因为 Map.Entry 有一个公共方法 setValue()。由于我无法将“this”设置为另一个值,因此无法真正做到。

标签: java hashmap


【解决方案1】:

我正在考虑让我用作值的类实现 Map.Entry。这看起来是一种合理的方法还是看起来很危险?

危险与否,这是糟糕的设计,因为它违反了单一责任原则。一个类不应该负责做自己的事情,也应该是一个 Map.Entry。当您现在想在另一个库中使用它时会发生什么?是否必须实现另一个接口?

虽然我不清楚你希望通过实施Map.Entry 获得什么(你是否试图扩展AbstractMap?),但我可以告诉你,这对我来说很糟糕,而且我从未见过它在实践中实现过。

这里的实际问题是什么?使用HashMap 有什么问题?

Map<String, MyClass> map = new HashMap<String, MyClass>();
MyClass myObj = new MyClass("myId");

//...
map.put(myObj.getIdentifier(), myObj);

MyClass retrievedObj = map.get("myId");

【讨论】:

  • 我认为您的基本观点是正确的。我只是想让事情变得不那么冗长,但在这个过程中我可能有点花哨。
【解决方案2】:

当您将对象(或类)添加到哈希映射时,您选择要发送到映射的键字段。只需在您的类中创建一个 getKey() 方法,该方法将返回您所需的密钥。

然后在向地图插入对象时使用它

例如,如果您有一个以 ID(字符串)为键的 Person 类。制作这个函数:

public String getKey()
{
   return this.Id; //Or use the getter method
}

并在将 Person 对象插入地图时使用它:

Person1.getKey();

【讨论】:

  • 我喜欢根据它们的作用来命名方法,而不是它们的用途。当你想创建一个Person 对象的数组时,你打算怎么做,你要在Person 中添加一个getIndex() 方法吗?我建议不要将你的方法命名为getKey(),因为你几乎肯定会在一个上下文中使用它,而不是你的地图的键。如果您的 getKey() 将返回此人的 ID,则不需要 getKey(),只需使用 getId()
【解决方案3】:

您始终可以使用 HashMap 并将字段添加为键(如果您要使其不可变,我认为这没有任何问题)。

【讨论】:

    【解决方案4】:

    这是HashMap 本身。只需确保对象中的“标识字段”正确实现了equals()hashCode() 方法即可。

    例如如果你的班级是:

    public class YourObject {
        private String identifyingField;
    

    然后:

    Map<String, YourObject> yourMap = new HashMap<String, YourObject>();
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2021-04-05
      相关资源
      最近更新 更多