0

在我目前的项目中,我用 Java 实现了以下数据结构。

Map<List<String>, Set<Subscriber>> regionSubscriber 
= new Hashtable<List<String>, Set<Subscriber>>();

我想对上述数据结构实现以下操作。

1)检查该映射中是否存在密钥(类似于containsKey(Key))。2) 获取带键列表的集合(类似于get(key))。

我尝试过使用 Map 的默认功能,例如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;
    }
4

2 回答 2

2

列表将用作键,但您必须知道您需要提供完全匹配。即,您需要提供等于()、具有相同hashCode() 并且顺序相同的列表元素。

注意:一旦密钥被用作密钥,您就无法更改密钥。例如,您不能将 List 添加为键,然后对其进行更改并期望 Map 仍然可以工作。

于 2012-06-29T11:41:06.203 回答
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 方法以使我们工作的信息,您可以在以下链接下找到一些信息: 在 Java 中覆盖 equals 和 hashCode 时应该考虑哪些问题?

于 2012-06-29T11:40:37.083 回答