Двойная итерация в 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())]);
        }
    }

который делает именно то, что я хотел, большое спасибо за вашу помощь.

Другие вопросы по тегам