“线程中的异常”;“主要”;java.lang.OutOfMemoryError:使用util包时的java堆空间
我的问题陈述: 一个文件中将有一组给定的单词(>5000个单词)。我们需要返回每个字符串(一组字谜)中以逗号(,)分隔的字谜列表 例如:[改变,稍后,分开,陷阱,肘部,下面,听,沉默,紧张] 例外情况:“线程中的异常”;“主要”;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
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个字母,当我发现特定的字母索引将其增加到一个时,它用空后的字符替换空字符,从而为一组错字生成唯一的键。哦,我明白了。所以它不是生成错字,而是检测它们。