哈希表链子puttall()

时间:2013-08-25 02:56:27

标签: java

我正在使用java哈希表链(一个数组按键值的hascode排序,其中索引是链接列表的)。以下是测试代码哈希表的初始化:

    Map<String, Integer> myMap = new HashtableChain<String, Integer>();

    myMap.put( "ACTG", 120 );
    myMap.put( "ABC", 123 );
    myMap.put( "XYZ", 123 );
    myMap.put( "HTML", 404 );
    myMap.put( "LOL", 999 );
    myMap.put( "OMG", 911 );

    Map<String, Integer> otherMap = 
                          new HashtableChain<String, Integer>();
    otherMap.put( "ARC", 121 );
    otherMap.put( "ACT", 102 );
    otherMap.put( "AUT", 109 );
    myMap.putAll( otherMap );
    System.out.println( "myMap pairs:" );
    System.out.println( myMap );

这是它应该输出的内容:

myMap pairs:
[[OMG=911][LOL=999], [ARC=121], [AUT=109, ABC=123], [AUT=109, ABC=123], [ACTG=120], [XYZ=123], [CIT=245], [HTML=404], [ACT=102], ]

使用这种方法:

public void putAll( Map<? extends K, ? extends V> map ){
Iterator<? extends K> nextKey = map.keySet().iterator();
    Iterator<? extends V> nextValue = map.values().iterator();
    while(nextKey.hasNext() && nextValue.hasNext()){
        put((K)nextKey.next(), (V)nextValue.next());
    }
}

上述方法中使用的方法:

public Set<K> keySet(){
    Set<K> coll = new HashSet<K>();
    for(int i = 0; i < table.length; i++){
        if(table[i] != null){
            for(Entry<K, V> nextItem : table[i]){
                coll.add(nextItem.key);
            }
        }
    }
    return coll;
}
public Collection<V> values(){
    Collection<V> coll = new LinkedList<V>();
    for(int i = 0; i < table.length; i++){
        if(table[i] != null){
            for(Entry<K, V> nextItem : table[i]){
                if(nextItem.value != null){
                    coll.add(nextItem.value);
                }
            }
        }
    }
    return coll;
}

输出:

[[OMG=911][LOL=999], [ARC=109], [AUT=102, ABC=123], [AUT=102, ABC=123], [ACTG=120], [XYZ=123], [CIT=245], [HTML=404], [ACT=121], ]

不确定我做错了什么,或者是否有不同的方法。所有评论都表示赞赏。

3 个答案:

答案 0 :(得分:1)

像这样修改你的代码:

Iterator<? extends K> nextKey = map.keySet().iterator();
    while(nextKey.hasNext()){
        put((K)nextKey.next(), map.get(nextKey.next()));
    }

答案 1 :(得分:1)

这正在解决G V的代码(不想在未经同意的情况下编辑他/她)。

Iterator<? extends K> nextKey = map.keySet().iterator();
    while(nextKey.hasNext()){
        K key = nextKey.next();
        put(key, map.get(key));
    }

答案 2 :(得分:0)

您的putAll方法存在问题,因为并不要求keySet()values()匹配。而是使用Map#entrySet()将它们作为匹配对检索。