我创建了一个简单的程序,从列表中读取一些值,只保留指定长度的值,并从中提取3个字符,但每次都从不同的位置提取。
例如,如果我们有值nick07n,程序应该从中提取三个随机字符,这些字符可能相同但不是从同一位置取得:
n0n [0, 4, 6]
虽然程序运行正常(因为我已经看到了一些结果),整个过程直到结束才成功执行或根本没有执行,因为我收到以下内存错误:
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 guessingTool.CheckProgram.main(CheckProgram.java:103)
这是我到目前为止的代码:
for (int i = 0; i < 5; i++) {
index = randomGenerator.nextInt(valuesList.size());
value = valuesList.get(index);
finalValue = "";
positions.clear();
for (int j = 0; j < 3; j++) {
index = randomGenerator.nextInt(value.length());
valueChar = value.charAt(index);
positions.add(index);
if (j == 0) {
finalValue += Character.toString(valueChar);
}
else if (j == 1) {
if (positions.get(0) != positions.get(1)) {
finalValue += Character.toString(valueChar);
}
else {
while (positions.get(0) == positions.get(1)) {
index = randomGenerator.nextInt(value.length());
valueChar = value.charAt(index);
positions.add(index);
}
}
}
else if (j == 2) {
if (positions.get(0) != positions.get(2) && positions.get(1) != positions.get(2)) {
finalValue += Character.toString(valueChar);
}
else {
while (positions.get(0) == positions.get(2) || positions.get(1) == positions.get(2)) {
index = randomGenerator.nextInt(passcode.length());
valueChar = value.charAt(index);
positions.add(index);
}
}
}
}
System.out.println(finalValue + " " + positions);
}
是否有可能发生的优化或任何其他建议的方法?
提前致谢。
答案 0 :(得分:2)
我认为您的问题来自代码的部分内容:
while (positions.get(0) == positions.get(1)) {
index = randomGenerator.nextInt(value.length());
valueChar = value.charAt(index);
positions.add(index);
}
如果条件为真,会发生什么?是你在位置列表的末尾追加索引(positions.add(index)不会推送索引,它只是追加到最后列表),但条件仍然成立,所以你有一个无限循环,在列表中添加越来越多的元素,并在某些时候你没有足够的堆来容纳所有这些元素。请参阅Javadoc https://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)
答案 1 :(得分:1)
我终于设法在我的代码中找到了错误。谢谢大家的回答,他们给了我很多帮助。问题出在所有人提到的while循环中。
我改变了这个:
else {
while (positions.get(0) == positions.get(1)) {
index = randomGenerator.nextInt(value.length());
valueChar = value.charAt(index);
positions.add(index);
}
}
对此:
else {
while (positions.get(0) == index) {
index = randomGenerator.nextInt(value.length());
}
valueChar = value.charAt(index);
positions.add(index);
finalValue += Character.toString(valueChar);
}
现在程序正常运行。