2015-11-16 2 views
1

Я использовал следующий способ присоединиться наборы, созданные в априорно присоединиться шагДвойной итерация через Hash Карта в Java

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; 
Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ; 

while(i1.hasNext()) { 
    while(i2.hasNext()) { 

     Entry<List<Integer>, Integer> pair1 = i1.next() ; 
     Entry<List<Integer>, Integer> pair2 = i2.next() ; 

     // Do some joining part here 

     System.out.println(pair1.getKey()); 
     System.out.println(pair2.getKey()); 

     } 
    } 
} 

На самом деле, я думал, что он будет перебирать все п * п значений хэша карта. Но происходит то, что оба итератора выполняются параллельно и выполняются только в n раз, как если бы оба итератора были одинаковыми. Пожалуйста, предложите способ преодолеть эту проблему.

ответ

3

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

Другим необходимым изменением является получение текущего ввода первого итератора вне внутреннего контура.

Iterator<Entry<List<Integer>, Integer>> i1 = hm.entrySet().iterator() ; 
while(i1.hasNext()) { 
    Entry<List<Integer>, Integer> pair1 = i1.next() ; 
    Iterator<Entry<List<Integer>, Integer>> i2 = hm.entrySet().iterator() ; 
    while(i2.hasNext()) { 
     Entry<List<Integer>, Integer> pair2 = i2.next() ; 
     // Do some joining part here 

     System.out.println(pair1.getKey()); 
     System.out.println(pair2.getKey()); 
     } 
    } 
} 
+3

И вы можете покончить с явным Итератором и использовать цикл 'for' в' entrySet'. – Thilo

+0

@Thilo Это правда. – Eran

3
Map<List<Integer>, Integer> hm.....; 

for (Map.Entry<List<Integer>,Integer> pair1 : hm.entrySet()) { 
    for (Map.Entry<List<Integer>,Integer> pair2 : hm.entrySet()) { 
     // do anything you want with pair1 and pair2, 
     // just don't make structural change to hm 
    } 
} 

Не видит большое значения явного использования итератора здесь, и я думаю, что это так гораздо понятнее просто использовать для-каждого цикла (он же усовершенствованный для цикла), так что я немного изменить подход OP в ,

+0

aaaah не знаю, почему я сделал такие очевидные ошибки. спасибо за указание –