在地图数据结构上包含键(List <string>键)和get(List <string>键)操作</string> </string>

时间:2012-06-29 11:32:24

标签: java

在我目前的项目中,我在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;
    }

2 个答案:

答案 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?