2014-09-19 29 views
0

我正在使用下面的代碼來使用hashmap刪除傳遞性child-> parent關係。 (HashMap中的數據集是在兒童安全>父條目的條款。)使用HashMap刪除傳遞關係

private static void factor_transitivity(Map<String,String> dataset, boolean complete) { 
    if (!complete) { 
     complete = true; // Assume that on this check everything will come out to be OK. 
     for (Map.Entry<String, String> pair : dataset.entrySet()) { 
      if (dataset.containsKey(pair.getValue())) { 
       complete = false; 
       String value = dataset.get(pair.getValue()); 
       dataset.put(pair.getKey(),value); 
       //System.out.print(""); 
       break; 
      } 
     } 
     factor_transitivity(dataset, complete); 
    } 
} 

請注意評論

//System.out.println("") 

線。如果我取消註釋該行,那麼代碼工作正常。但是,如果我將其留言評論,則會收到如下錯誤消息:

Exception in thread "main" java.lang.StackOverflowError 
at java.util.HashMap.hash(HashMap.java:362) 
at java.util.HashMap.getEntry(HashMap.java:462) 
at java.util.HashMap.get(HashMap.java:417) 

爲什麼我會得到這種奇怪的行爲?

+0

向我們展示更多的堆棧。 – 2014-09-19 13:07:05

+0

提供一個http://stackoverflow.com/help/mcve **,其中包含一張填充了數據的地圖,該數據顯示實際發生錯誤的位置。 – Marco13 2014-09-19 13:59:09

+0

是的,只要我能夠自己識別這些數據,就會上傳包含導致問題的數據的地圖。我有一個非常大的輸入數據集,因此需要一些時間才能看到我自己。 – bikashg 2014-09-19 14:42:35

回答

-1

編輯: http://ideone.com/zHX7NI

import java.util.*; 
import java.lang.*; 
import java.io.*; 

/* Name of the class has to be "Main" only if the class is public. */ 
class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
    // your code goes here 
    factor_transitivity(new HashMap<String,String>(){{ 
    put("abc","abc"); 
    put("ghi","ghi"); 
    }},false); 
    } 
    private static void factor_transitivity(Map<String,String> dataset, boolean complete) { 
    if (!complete) { 
    complete = true; // Assume that on this check everything will come out to be OK. 
    for (Map.Entry<String, String> pair : dataset.entrySet()) { 
     if (dataset.containsKey(pair.getValue())) { 
      complete = false; 
      String value = dataset.get(pair.getValue()); 
      dataset.put(pair.getKey(),value); 
      System.out.print("hello"); 
      break; 
      } 
     } 
    factor_transitivity(dataset, complete); 
    } 
} 
} 

現在你可以看到這個代碼是遞歸的它保持連連調用factor_transitivity方法和打印「你好」。即使當我註釋掉該行時,由於該方法的遞歸性質,也會發生相同的錯誤(http://ideone.com/ffA0pG)。

+0

該代碼不會執行任何操作。 – 2014-09-19 13:08:21

+0

我指出代碼與取消註釋/評論該行沒有任何關係。錯誤在於地圖。 – 2014-09-19 18:49:35

+0

當有問題的線路甚至不會被執行時,你不會展示任何東西。 – 2014-09-19 19:06:53