在我目前的项目中,我在Java中实现了以下数据结构。
Map<List<String>, Set<Subscriber>> regionSubscriber
= new Hashtable<List<String>, Set<Subscriber>>();
我想对上述数据结构实施以下操作。
1)检查此地图中是否存在密钥(类似于containsKey(Key)
)。
2)获取带有键列表的Set(类似于get(key)
)。
我尝试使用地图的默认功能containskey(Key)
和get(Key)
。但是,它们不起作用,因为这里的Key是List(不是单个Object)。
你能告诉我有关行动的实施情况吗?让我知道如果您需要更多细节以保持清晰。
更新:我编写了以下equals()和hashCode()函数。请检查这些功能。他们没有工作。对这些功能的任何更正。
public boolean equals(Object obj){
boolean booleanFlag = false;
List<String> regionID = (List<String>) obj;
for(int i=0; i< regionID.size() ; i++) {
if ( regionID.get(i).equals(this.regionIDs.get(i)) ){
booleanFlag = true;
} else {
booleanFlag = false;
}
}
return booleanFlag;
}
@Override
public int hashCode() {
int hashValue = 0;
for(int i=0; i< regionIDs.size(); i++) {
hashValue = hashValue + regionIDs.get(i).hashCode();
}
return hashValue;
}
答案 0 :(得分:2)
列表将作为键,但您需要知道您需要提供完全匹配。即你需要提供List的元素,这些元素是equals(),具有相同的hashCode()并且顺序相同。
注意:一旦将密钥用作密钥,就无法更改密钥。 例如您不能将List添加为键,然后更改它并期望Map仍然有效。
答案 1 :(得分:1)
对于containsKey和get函数在Map上正常工作,用作键的对象的类需要实现hashCode和equals方法。
您需要做的是将您用作密钥的List类型子类化,例如:
public class MyList extends ArrayList() {
//constructors
public boolean equals(Object obj) {
// a good equals implementation
}
public int hashCode() {
// a good hashcode implementation
}
}
有关如何实现equals和hashCode方法以使我们工作的信息,您可以在以下链接下找到一些信息: What issues should be considered when overriding equals and hashCode in Java?