2014-09-19 59 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