在我目前的项目中,我在Java中实现了以下数据结构。
Map<List<String>, Set<Subscriber>> regionSubscriber
= new Hashtable<List<String>, Set<Subscriber>>();
我想对上述数据结构实现以下操作。
1)检查此地图中是否存在密钥(类似于containsKey(Key)
)。2)获取带键列表的集合(类似于get(key)
)。
我尝试过使用地图的默认功能,如containskey(Key)
和get(Key)
。但是,它们不起作用,因为这里的键是列表(不是单个对象)。
你能建议我实施这些操作吗?如果您需要更多详细信息以澄清,请告诉我。
更新:我写了以下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;
}
列表将用作键,但您必须知道您需要提供完全匹配。 即您需要提供列表的元素,这些元素是 equals(),具有相同的 hashCode() 并且顺序相同。
注: 密钥用作密钥后,无法更改该密钥。例如,您不能添加列表作为键,然后对其进行更改并期望地图仍然有效。
为了使 containsKey 和 get 函数在 Map 上正常工作,用作键的对象的类需要实现 hashCode 和 equals 方法。
您需要做的是将用作键的列表类型进行子类化,例如:
public class MyList extends ArrayList() {
//constructors
public boolean equals(Object obj) {
// a good equals implementation
}
public int hashCode() {
// a good hashcode implementation
}
}
有关如何实现 equals 和 hashCode 方法来工作的信息,您应该在以下链接下找到一些信息:在 Java 中覆盖 equals 和 hashCode 时应考虑哪些问题?