2013-01-25 21 views
1

我有一个LinkedHashMap的,我挺过来了双迭代,如下面的代码表示:与对称的结果HashMap的双循环(跳过冗余的情况下)

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)位置开始第二次迭代来保存一些运行时间,就像使用eg。数组:

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

谢谢您的帮助

+0

这个语法迭代整个集合;您将不得不手动将数据转换为允许随机访问并自行迭代的结构。你也可以明确地使用迭代器并手动将它们推进到所需的位置。 – Dariusz

+0

“结果是对称的”是什么意思?结果将永远不对称:https://ideone.com/9g5x3L,那么哪种优化不会删除单个唯一的组合?您可能正在做一些*奇怪*:> –

+0

doSomthng(e.getKey(),t.getKey())== doSomthng(t.getKey(),e.​​getKey())的结果 – Hellski

回答

0

的转换的entrySet到一个数组,遍历这个数组:

Entry<Integer,Integer> entries = 
    nmResultMap.entrySet().toArray(new Entry<Integer,Integer>[0]); 
+0

我不认为这会节省时间,因为'toArray'内部会迭代整个集合来创建数组。 – partlov

+0

不过,它基本上是唯一可以做到你想要的。 –

+1

@partlov不是关于通过HashMap保存迭代,而是关于减少昂贵函数doSomthing()的执行的保存。 – Hellski

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

这正是我想要的,非常感谢您的帮助。