一个哈希映射,其中值对象的字段是关键字?

时间:2011-10-27 18:42:21

标签: java hashmap

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

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

4 个答案:

答案 0 :(得分:4)

  

我正在考虑让我使用的类作为值实现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");

答案 1 :(得分:3)

将对象(或类)添加到hashmap时,选择要发送到地图的关键字段。只需在类中创建一个getKey()方法,它将返回所需的键。

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

例如,如果您有一个ID(String)作为键的Person类。使这个功能:

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

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

Person1.getKey();

答案 2 :(得分:0)

你总是可以使用HashMap并添加字段作为键(如果你打算让它变成不可变的话,我没有看到任何问题)。

答案 3 :(得分:0)

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

e.g。如果你的班级是:

public class YourObject {
    private String identifyingField;

然后:

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