1

私は 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) 位置で 2 番目の反復を開始することで、ランタイムを節約したいと考えています。配列:

for (int i  =0;i<array.length();i++){ 
    for (int j=i+1;j<array.length();j++){
        doSomthng(array[i][j]);
    }
}

ご協力ありがとうございました

4

2 に答える 2

0

私が使用しているJBNizetの回答による動機付け:

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())]);
        }
    }

これは私が望んでいたことを正確に実行します。あなたの助けに感謝します。

于 2013-01-26T13:39:59.670 に答える
0

entrySet を配列に変換し、この配列をループします。

Entry<Integer,Integer> entries = 
    nmResultMap.entrySet().toArray(new Entry<Integer,Integer>[0]);
于 2013-01-25T13:40:34.180 に答える