我正在构建一个程序,其中用户键入所需的单词,并将该单词逐字母放入ArrayList中。然后开始随机字母生成器,然后将生成的每个字母放入另一个ArrayList中。然后比较两个列表中的字母,并且一旦发生器随机拼写所需的单词,程序就停止。
高概率的执行看起来像这样:
Would you like to use:
1. Lowercase Letters
2. Uppercase Letters
3. Numbers
4. Special Characters
5. Space
(Example, if you'd like to use Lowercase Letters and Numbers, type "13")
1
What character(s) would you like to be tested?
(Example: "RaNdOm123", "Stephen")
j
u
f
p
b
z
t
j
Successful! 7 characters generated until completion.
但是当概率非常低时,程序会运行并最终显示此异常:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at Generator.stringGenerator(Generator.java:53)
at Driver.main(Driver.java:16)
这是创建和比较ArrayLists的代码:
for (int i = 0; i < desiredText.length(); i++) {
desiredArray.add(desiredText.charAt(i));
}
boolean proceed = true;
int k = 0;
int l = 0;
do {
Random r = new Random();
for (int i = 0; i < desiredText.length(); i++) {
int n = r.nextInt(limit);
randomArray.add(line.charAt(n));
System.out.println(randomArray.get(k));
k++;
if (!desiredArray.get(i).equals(randomArray.get(l))) {
l++;
break;
} else {
l++;
}
if (i == desiredText.length() - 1) {
proceed = false;
System.out.println("Successful!");
System.out.println(randomArray.size() + " characters generated until completion.");
break;
}
}
} while (proceed == true);
我正在考虑检查randomArray的大小是否大于desiredText的长度。如果是,那么我将删除数组的第一个元素并循环整个过程。那会少用内存吗?如果没有,您对如何修改代码有任何建议吗?因此广泛的ArrayList不会抛出此异常?成功创建所需单词的最大ArrayList长度约为6500万个字符。我想达到我可以使用整个段落作为所需单词的程度,让程序运行几天直到它随机输入它。所有帮助将不胜感激。感谢。
答案 0 :(得分:1)
您收到out of memory error
,因为您的代码会不断添加字符,而您不需要这些字符。在do-while nest
中为randomArray创建一个新的ArrayList,或在最后for loop
的randomArray上使用removeAll。
存储在long
或BigInteger
生成的字符总数。
然后你可以根据需要运行它。