2013-08-25 2 views
0

Я работаю с цепочкой таблиц хэши java (массив отсортирован по индексу ключа, где индексы связаны списком). Вот инициализации хэш-таблицы для тестового кода:Hash table Chain puttall()

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], ] 

Не уверен, что я делаю неправильно, или если есть другой способ сделать это. Все комментарии оценены.

ответ

1

Измените код следующим образом:

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

Почти работали, вместо: положить ((K) nextKey.next(), map.get (nextKey.next())); Я сделал: K key = nextKey.next(); положить (ключ, map.get (ключ)); Потому что это давало мне нулевой указатель (значение на один шаг впереди ключа). Не могу поверить, что я смотрел функцию get() в первую очередь ... слишком много часов, играя главную роль в том же коде, который, я думаю ... – Kerher

0

Ваш метод putAll глючит, потому что нет никаких требований, что keySet() и values() быть согласованы. Вместо этого используйте Map#entrySet(), чтобы получить их в виде пар пар.

+0

У меня были проблемы, потому что, пытаясь использовать точечную нотацию на карте, я не мог доступ к таблице., которая хранила все ключи и значения и не понимала, что я полностью забыл о функции map.get (Key), которая возвращает значение на основе ключа. – Kerher

1

Это работает с кодом G V (он не хотел редактировать его/ее без согласия).

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