Двойная итерация в HashMap с симметричным результатом (пропустить избыточные случаи)
У меня есть LinkedHashMap, и я дважды перебираю его, как указано в коде ниже:
LinkedHashMap<Integer,Integer> nmResultMap = getResultMap();
float[][] results = new float[nmResultMap.size()][nmResultMap.size()];
for (Entry<Integer,Integer> e :nmResultMap.entrySet()){
for (Entry<Integer,Integer> t :nmResultMap.entrySet()){
results[e.getValue()][t.getValue()] = doSomthng(e.getKey(),t.getKey());
}
}
Это работает нормально, но так как результаты симметричны (doSomthng(e.getKey(),t.getKey())==doSomthng(t.getKey(),e.getKey())
) Я хотел бы сэкономить некоторое время выполнения, запустив вторую итерацию со следующей (текущей +1) позиции первой итерации, как это легко сделать, например, с помощью. Массивы:
for (int i =0;i<array.length();i++){
for (int j=i+1;j<array.length();j++){
doSomthng(array[i][j]);
}
}
Спасибо за помощь
2 ответа
Решение
Преобразуйте entrySet в массив, переберите этот массив:
Entry<Integer,Integer> entries =
nmResultMap.entrySet().toArray(new Entry<Integer,Integer>[0]);
Мотивированный через JB Nizet ответ я использую:
for (Entry<Integer,Integer> entry:h.getResultMap().entrySet()){
nmResultList.add(entry);
}
float[][] results = new float[nmResultList.size()][nmResultList.size()];
for (int i=0;i<nmResultList.size();i++){
for (int j =i+1; j<nmResultList.size();j++){
results[nmResultList.get(i).getValue()][nmResultList.get(j).getValue()] = doSomthng(h.data[nmMap.get(nmResultList.get(i).getKey())], h.data[nmMap.get(nmResultList.get(j).getKey())]);
}
}
который делает именно то, что я хотел, большое спасибо за вашу помощь.