<String> 映射数据结构上的包含键(列表键)和获取(列表<String>键)操作



在我目前的项目中,我在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 时应考虑哪些问题?

最新更新