我正在使用以下代码通过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) 为什么我会有这种奇怪的行为?
发布于 2014-09-19 21:04:13
编辑: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方法,并一次又一次地打印"hello“。即使当我注释掉该行时,由于该方法的递归性质,也会发生相同的错误(http://ideone.com/ffA0pG)。
https://stackoverflow.com/questions/25934463
复制相似问题