2015-05-19 2 views
0

Я добавляю данные в HashMap, где node - это объект с индексом переменных и преемником.Данные массива HashMap заменяются

private static HashMap <Integer, node> peerList = new HashMap<Integer, node>(); 

public void generateFingerTable (int node_position) { 

      chordSize = chord.initChordSize;   
      chord chord = new chord(); 

     //create new node and add to map 
     node newPeer = new node(); 
     peerList.put(node_position, newPeer); 

     for (int i=0; i<chordSize; i++) { 

      int temp = i+1; 

      newPeer.index = new int [chordSize]; 
      newPeer.successor = new int [chordSize]; 

      int temp1 = node_position + (int)Math.pow(2, temp-1) % chord.getChordSize(); 

      peerList.get(node_position).index[i] = temp;     
      peerList.get(node_position).successor[i] = temp1; 

      System.out.println ("Index: " + newPeer.index[i] + "\n" + "Successor: " + 
        newPeer.successor[i]);   
     } 
} 

public void printFingerTable() { 

     for (Map.Entry<Integer, node> m : peerList.entrySet()) { 
      System.out.println ("Peer " + m.getKey() + " with Index: " + m.getValue().getIndex() + " Successor: " + 
            m.getValue().getSuccessor()); 
     } 

При печати детали Hash, результат показывает индекс: [0,0,0,0,5], преемник: [0,0,0,0,16], который означает, что ранее добавленные элементы заменяется, и только последний элемент сохраняется в Hashmap.

Предложенный результат должен быть индексом [1,2,3,4,5], преемником: [1,2,4,8,16]. Как я могу изменить это, чтобы данные не заменялись?

+1

Привет 'HashMap' не позволит Дубликаты всякий раз, когда он находит дубликат ключа он будет заменить это последнюю. – Babel

ответ

1

Вы инициализировать index и successor массивов в каждой итерации цикла, поэтому только значение последнего индекса остается в конце концов, а остальные равны 0.

Вы должны инициализировать массивы перед циклом.

Изменить код:

public void generateFingerTable (int node_position) { 

     chordSize = chord.initChordSize;   
     chord chord = new chord(); 

     //create new node and add to map 
     node newPeer = new node(); 
     peerList.put(node_position, newPeer); 

     newPeer.index = new int [chordSize]; 
     newPeer.successor = new int [chordSize]; 
     for (int i=0; i<chordSize; i++) { 
      int temp = i+1; 
      int temp1 = node_position + (int)Math.pow(2, temp-1) % chord.getChordSize(); 
      peerList.get(node_position).index[i] = temp;     
      peerList.get(node_position).successor[i] = temp1; 

      System.out.println ("Index: " + newPeer.index[i] + "\n" + "Successor: " + 
        newPeer.successor[i]);   
     } 
} 
+0

Спасибо. Мне удалось получить намеченный результат с этим изменением. – user4914916

0

Я думаю, вы должны использовать другой тип данных или структуру, чем HashMap, как HashMaps не гарантируют порядок. Я указываю на это, поскольку ваш код peerList.put(node_position, newPeer);, по-видимому, подразумевает, что вы устанавливаете позицию своего объекта в своем HashMap, но это не так. Я только говорю это, потому что вы просто используете переменную с именем node_postion для ключа или хеша, где ваш объект данных будет жить в вашем HashMap. См. Эту ссылку для получения более подробной информации.

Difference between HashMap, LinkedHashMap and TreeMap

Смежные вопросы