Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“线程中的异常”;“主要”;java.lang.OutOfMemoryError:使用util包时的java堆空间_Java_File_Exception_Arraylist_Out Of Memory - Fatal编程技术网

“线程中的异常”;“主要”;java.lang.OutOfMemoryError:使用util包时的java堆空间

“线程中的异常”;“主要”;java.lang.OutOfMemoryError:使用util包时的java堆空间,java,file,exception,arraylist,out-of-memory,Java,File,Exception,Arraylist,Out Of Memory,我的问题陈述: 一个文件中将有一组给定的单词(>5000个单词)。我们需要返回每个字符串(一组字谜)中以逗号(,)分隔的字谜列表 例如:[改变,稍后,分开,陷阱,肘部,下面,听,沉默,紧张] 例外情况: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3210) at java.util.Arrays.copyOf(Array

我的问题陈述:

一个文件中将有一组给定的单词(>5000个单词)。我们需要返回每个字符串(一组字谜)中以逗号(,)分隔的字谜列表 例如:[改变,稍后,分开,陷阱,肘部,下面,听,沉默,紧张]

例外情况:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
at java.util.ArrayList.add(ArrayList.java:462)
at FindAnagrams01.anagramsList(FindAnagrams01.java:25)
at FindAnagrams01.main(FindAnagrams01.java:7)
我的代码是:

  public static List<String> anagramsList(String filePath) throws IOException {
    BufferedReader br = new BufferedReader(new FileReader(filePath));
    String str = br.readLine();
    List<List<String>> result = new ArrayList<List<String>>(10000);
    HashMap<String, ArrayList<String>> map = new HashMap<String,ArrayList<String>>(10000);
    while(str != null) {
        char[] arr = new char[26];
        for(int i = 0; i < str.length(); i++) {
            arr[str.charAt(i) - 'a']++;              
        }
        String ns = new String(arr);
        if(map.containsKey(ns)){
            map.get(ns).add(str);
        } else {
            ArrayList<String> al = new ArrayList<String>(10000);
            al.add(str);
            map.put(ns, al);
        }
    }
    br.close();
    result.addAll(map.values());
    String res[] = new String[10000];
    for(int i = 0; i < result.size(); i++) {
        int isIntial = 0;
        for(String j : result.get(i)) {
            if ((result.get(i).size()) > 1) {
                if (isIntial == 0) {
                    res[i] = j;
                    isIntial = 1;
                }
                else
                    res[i] += "," + j;
            } 
        }
    }
    List<String> angrms = new ArrayList<String>(10000);
    for (int i = 0; i < res.length; i++) {
        if (res[i] != null)
            angrms.add(res[i]);
    }
    return angrms;
}
公共静态列表anagramsList(字符串文件路径)引发IOException{
BufferedReader br=新的BufferedReader(新文件读取器(文件路径));
字符串str=br.readLine();
列表结果=新的ArrayList(10000);
HashMap=新的HashMap(10000);
while(str!=null){
char[]arr=新字符[26];
对于(int i=0;i1){
如果(Isential==0){
res[i]=j;
isiential=1;
}
其他的
res[i]+=“,”+j;
} 
}
}
List angrms=新阵列列表(10000);
for(int i=0;i
问题在于这是一个无限循环:

while(str != null) {
    char[] arr = new char[26];
    for(int i = 0; i < str.length(); i++) {
        arr[str.charAt(i) - 'a']++;              
    }
    String ns = new String(arr);
    if(map.containsKey(ns)){
        map.get(ns).add(str);
    } else {
        ArrayList<String> al = new ArrayList<String>(10000);
        al.add(str);
        map.put(ns, al);
    }
}
while(str!=null){
char[]arr=新字符[26];
对于(int i=0;i
因为
str
不会在循环体中更改。结果,您会反复向数组列表添加字符串,直到最终耗尽内存


您的代码还有其他问题。。。但这就解释了你的OOME。

哈希映射
-什么?你是手工输入代码的吗?什么是
arrayList
?你为什么把所有的东西都预测到10000?这是你最喜欢的号码吗?你为什么用
char[]
呼叫
++
<代码>arr[str.charAt(i)-'a']+
。这段代码很奇怪,有很多种方式-目前它还没有编译,更不用说抛出任何
异常了。你有一个循环
while(str!=null){
,但是在它里面你永远不会更改str,所以它永远不会以char[i]结尾++.实际上,我正在设置一个唯一的字符串来查找特定键的字谜,我想将我的文件限制在10000字以内。我能知道这些问题是什么吗?首先,我看不到任何生成字谜的代码。char arr[26]表示26个字母,当我发现特定的字母索引将其增加到一个时,它用空后的字符替换空字符,从而为一组错字生成唯一的键。哦,我明白了。所以它不是生成错字,而是检测它们。