以下是运行测试人员课程时收到的错误。我一直在查看代码指向的位置,但我不知道问题出在哪里。它一直说我也没有Java堆空间,不知道那是什么。我也不确定我的递归getsubset()方法是否正常工作,因为我甚至无法编译我的测试器类。如果我的代码中有任何其他错误,可以自由指出它们。谢谢!
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.<init>(String.java:215)
at java.lang.StringBuilder.toString(StringBuilder.java:430)
at SubsetGenerator.getSubsets(SubsetGenerator.java:68)
at SubsetGenerator.getSubsets(SubsetGenerator.java:64)
at SubsetGeneratorTester2.main(SubsetGeneratorTester2.java:23)
Press any key to continue...
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
Prints subsets of String
*/
public class SubsetGenerator
{
private String word="";
private ArrayList<String> subsets;
/**
Constructs a word to generate subsets from
@param text input by user
*/
public SubsetGenerator(String textinput)
{
word=textinput;
subsets = new ArrayList<String>();
}
/**
retrieves word
@return the word
*/
public String getWord()
{
return word;
}
/**
get subsets
@return subset arraylist
*/
public ArrayList<String> getSubsets()
{
if(word.length() == 1)
{
subsets.add(word);
return subsets;
}
else
{
String removed = word.substring(0,1);
word = word.substring(1);
getSubsets();
for (int i = 0; i < subsets.size(); i++)
{
String temp = removed + subsets.get(i);
subsets.add(temp);
}
subsets.add(removed);
return subsets;
}
}
//sort subsets
public void sortSubsets()
{
Collections.sort(subsets);
}
}
import java.util.Collections;
import java.util.ArrayList;
import java.util.List;
/**
This program tests the subset generator.
*/
public class SubsetGeneratorTester2
{
public static void main(String[] args)
{
SubsetGenerator generator = new SubsetGenerator("rum");
List<String> subsets = generator.getSubsets();
// Sort the result for checking
Collections.sort(subsets);
System.out.println(subsets);
System.out.println("Expected: [, m, r, rm, ru, rum, u, um]");
}
}
答案 0 :(得分:0)
问题似乎与循环有关。如果它不为空,则添加一个元素,以便增加大小。然后,由于元素为空,i + 1不能大于或等于新大小。这很容易耗尽堆。但是,对于立即出现运行时错误的空字符串,这会失败。
我可以确认循环是罪魁祸首。通过简单地将索引移出循环来解决此问题。这样,它就不会随着元素的添加而更新。
int size = subsets.size();
for (int i = 0; i < size; i++)
{
String temp = removed + subsets.get(i);
subsets.add(temp);
}
然而,还有另一个问题。
您的方法导致了设置:
[m, r, rm, ru, rum, u, um]
这很容易改变,因为你的基本情况是错误的。我也不想修改太多代码(但有更好的方法可以做到这一点!)
在您的示例中,空字符串永远不会工作,但逻辑上应该如此。我将如何处理这个,如下(伪代码):
List subset(String str):
if(length == 0):
return [""];
x = subset(str.substring(1));
result = [];
for s in x:
result += [s, str.charAt(0) + s];
return result;
这当然是伪代码(实际上接近python)。我不想全力以赴,但基本的优点是要了解如何实现这些目标。
需要注意的重要一点是,对于每个元素,我们在列表中添加2个字符串。一个是当前字符串的第一个字符,另一个是当前字符串的第一个字符。
考虑一些基本情况:
subset("") -> [""]
subset("a") -> ["", "a"]
subset("ab") -> ["", "a", "b", "ab"]
希望你能看到这种模式。对于每个字符串,我们添加一个字符,一个不添加。
答案 1 :(得分:0)
我会给你另一个比你更明确的解决方案。首先从单词中删除一个字符。然后使用该字符连接其余部分。最后递归地调用getSubsets()
。如果word.length
为零,则它到达底部并返回。
public ArrayList<String> getSubsets(){
if(word.length()==0){
subsets.add("");
return subsets;
}
else{
String removed=word.substring(0,1);
word=word.substring(1);
subsets.add(removed);
for(int i=0;i<word.length();i++){
String temp=removed+word.substring(0,i+1);
subsets.add(temp);
}
}
getSubsets();
return subsets;
}
这是我的回答:
root@MQ-PC:/home/java/algorithm# java SubsetGenerator
[r, ru, rum, u, um, m, ]