Java 一种哈希映射,其中值对象';s字段是关键?
我想知道是否有像HashMap这样的类,其中键是对象中的标识字段 如果没有,我正在考虑使用类作为值implementmap.Entry。这似乎是一种合理的方法还是一种危险的方法?(我将使我的键字段不可变。) 我正在考虑使用类作为值implementmap.Entry。这似乎是一种合理的方法还是一种危险的方法 无论危险与否,这都是一个糟糕的设计,因为它违反了单一责任原则。一个类不应该负责自己的事情,也不应该是一个Map.Entry。如果您现在想在另一个库中使用它,会发生什么?您必须实现另一个接口吗 虽然我不清楚通过实现Java 一种哈希映射,其中值对象';s字段是关键?,java,hashmap,Java,Hashmap,我想知道是否有像HashMap这样的类,其中键是对象中的标识字段 如果没有,我正在考虑使用类作为值implementmap.Entry。这似乎是一种合理的方法还是一种危险的方法?(我将使我的键字段不可变。) 我正在考虑使用类作为值implementmap.Entry。这似乎是一种合理的方法还是一种危险的方法 无论危险与否,这都是一个糟糕的设计,因为它违反了单一责任原则。一个类不应该负责自己的事情,也不应该是一个Map.Entry。如果您现在想在另一个库中使用它,会发生什么?您必须实现另一个接口吗
Map.Entry
(您是否试图扩展AbstractMap
?)您希望获得什么,但我可以告诉您,这对我来说很难闻,而且我从未在实践中见过这样做
这里的实际问题是什么?使用哈希映射有什么问题
Map<String, MyClass> map = new HashMap<String, MyClass>();
MyClass myObj = new MyClass("myId");
//...
map.put(myObj.getIdentifier(), myObj);
MyClass retrievedObj = map.get("myId");
Map Map=newhashmap();
MyClass myObj=新的MyClass(“myId”);
//...
put(myObj.getIdentifier(),myObj);
MyClass retrievedObj=map.get(“myId”);
我正在考虑使用类作为值implementmap.Entry。这似乎是一种合理的方法还是一种危险的方法
无论危险与否,这都是一个糟糕的设计,因为它违反了单一责任原则。一个类不应该负责自己的事情,也不应该是一个Map.Entry。如果您现在想在另一个库中使用它,会发生什么?您必须实现另一个接口吗
虽然我不清楚通过实现Map.Entry
(您是否试图扩展AbstractMap
?)您希望获得什么,但我可以告诉您,这对我来说很难闻,而且我从未在实践中见过这样做
这里的实际问题是什么?使用哈希映射有什么问题
Map<String, MyClass> map = new HashMap<String, MyClass>();
MyClass myObj = new MyClass("myId");
//...
map.put(myObj.getIdentifier(), myObj);
MyClass retrievedObj = map.get("myId");
Map Map=newhashmap();
MyClass myObj=新的MyClass(“myId”);
//...
put(myObj.getIdentifier(),myObj);
MyClass retrievedObj=map.get(“myId”);
将对象(或类)添加到hashmap时,选择要发送到映射的密钥字段。只需在类中创建一个getKey()方法,该方法将返回所需的键
然后在将对象插入地图时使用它
例如,如果您有一个ID(字符串)为键的Person类。使此功能:
public String getKey()
{
return this.Id; //Or use the getter method
}
并在将Person对象插入地图时使用它:
Person1.getKey();
将对象(或类)添加到hashmap时,选择要发送到映射的键字段。只需在类中创建一个getKey()方法,该方法将返回所需的键
然后在将对象插入地图时使用它
例如,如果您有一个ID(字符串)为键的Person类。使此功能:
public String getKey()
{
return this.Id; //Or use the getter method
}
并在将Person对象插入地图时使用它:
Person1.getKey();
您可以始终使用HashMap并将字段添加为键(如果要使其不可变,我看不出有任何问题)。您可以始终使用HashMap并将字段添加为键(如果要使其不可变,我看不出有任何问题)。这是HashMap
本身的问题。只需确保对象中的“标识字段”正确实现了equals()
和hashCode()
方法
e、 g.如果您的班级是:
public class YourObject {
private String identifyingField;
然后:
Map yourMap=newhashmap();
这是HashMap
本身。只需确保对象中的“标识字段”正确实现了equals()
和hashCode()
方法
e、 g.如果您的班级是:
public class YourObject {
private String identifyingField;
然后:
Map yourMap=newhashmap();
你的物体看起来怎么样?为什么你需要一张特殊的地图?创建一个类V
,给它一个成员字段K
,并创建一个Map
。再想一想,我创建值实现Map.Entry的概念是不可行的,因为Map.Entry有一个公共方法setValue()。因为我不能将“this”设置为另一个值,所以它实际上无法实现。您的对象是什么样子的?为什么需要一个特殊的贴图?创建一个类V
,给它一个成员字段K
,并创建一个Map
。再想一想,我创建值实现Map.Entry的概念是不可行的,因为Map.Entry有一个公共方法setValue()。既然我不能把“this”设为另一个值,那就不可能真正做到。我认为你的基本观点是正确的。我只是想让事情不那么冗长,但在这个过程中我可能有点想入非非。我认为你的基本观点是正确的。我只是想让事情变得不那么冗长,但在这个过程中,我可能有点想入非非。我喜欢以方法的用途命名,而不是以它们的用途命名。如果要创建Person
对象的数组,要向Person
添加getIndex()
方法吗?我建议不要命名您的方法getKey()
,因为您几乎肯定会在一个上下文中使用它,而不是在地图中的键。如果您的getKey()
要返回此人的Id,那么就不需要getKey()
,只需使用getId()
。我喜欢按照方法的用途来命名方法,而不是按照它们的用途来命名。如果要创建Person
对象的数组,要向Person
添加getIndex()
方法吗?我建议不要命名您的方法getKey()
,因为您几乎肯定会在一个上下文中使用它,而不是在地图中的键。如果您的getKey()
将返回此人的Id,则无需