2015-02-20 4 views
1

У меня есть HashMap объявленИтерация дважды HashMap Java

static HashMap<String,ArrayList<Integer>> inverted_index = new HashMap<String,ArrayList<Integer>>(); 

я итерация над своими ключами, как

public static void printInvertedIndex() throws FileNotFoundException{ 
    PrintWriter writer = new PrintWriter(new File("InvertedIndex.txt")); 
    Iterator it = inverted_index.entrySet().iterator(); 

    while (it.hasNext()) { 
     Map.Entry pair = (Map.Entry)it.next(); 
     writer.println(pair.getKey() + " " + pair.getValue()); 
     it.remove(); 
     } 

    writer.close(); 
} 

Я сделал все это в функции, называемой printInvertedIndex(). Теперь в какой-то другой функции я хочу перебрать HashMap снова, так что я сделал это

public static void createPermutermIndex(){ 
    permuterm_index.clear(); 

    Iterator it = inverted_index.entrySet().iterator(); 

    while (it.hasNext()) { 
     System.out.println("here"); 
     Map.Entry pair = (Map.Entry)it.next(); 
     String temp; 
     temp = pair.getKey() + "$"; 
     ArrayList<String> perms = rotations(temp); 
     System.out.println(perms.size()); 
     for(int i=0; i<perms.size(); i++) 
      System.out.println(perms.get(i)); 
      //permuterm_index.put(temp, perms.get(i)); 
     it.remove(); 
     } 
    } 

Но я не получаю «здесь», напечатанной во время вызова createPermutermIndex(). То есть, мой итератор не выполняет итерации над элементами inverted_index.

Есть ли способ, которым я могу повторить его снова?

+1

Ваша 'inverted_index'' Карта явно пуста. – Mena

+2

Почему вы используете сырой тип «Итератор»? Вы четко знаете о дженериках из вашей декларации «Карта». –

+0

@BoristheSpider от моего личного опыта, использование дженериков и знание о них - совсем другая вещь. Вы можете сделать это раньше, чем раньше, если вы родились и выросли на Java 5+. – Mena

ответ

7
while (it.hasNext()) { 
    Map.Entry pair = (Map.Entry)it.next(); 
    writer.println(pair.getKey() + " " + pair.getValue()); 
    it.remove(); // <- This is your problem 
} 

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

Кажется, что вы не хотите удалять что-либо во время этих циклов, поэтому просто удалите эти линии it.remove() в ваших двух циклах.

+0

Хороший улов. Кроме того, является ли это соглашением перебирать объект «Итератор», а не напрямую использовать «HashMap.entrySet()»? – nyxaria

+0

@nyxaria Это нормально, хотя в наши дни было бы предпочтительнее использовать 'for (Map.Entry пара: invertedIndex.entrySet()) {...}' – Alnitak

+0

Да, в этом была проблема. – rpn8281

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