【发布时间】:2014-02-14 12:38:05
【问题描述】:
*已解决:没有清除 ArrayList ebwteen 调用,因此列表不断增加。我在 nextPermutation() 的第二个 for 循环之前添加了 perm.clear(),问题解决了!感谢所有帮助过的人。
我在 toString 方法中返回 ArrayList 时遇到问题。我的任务是从数字 1-10 生成 10 个排列列表。在驱动程序中调用nextPermutation方法10次。
我希望我的输出如下所示:
List 1: [4 6 8 1 9 7 10 5 3 2]
List 2: [6 8 1 7 3 4 9 10 5 2]
等等。
相反,每个新列表在添加新排列的同时保留上一个列表的排列,所以我得到这个:
List 1: [6, 2, 3, 9, 4, 5, 10, 8, 7, 1]
List 2: [6, 2, 3, 9, 4, 5, 10, 8, 7, 1, 3, 7, 2, 9, 1, 10, 6, 4, 8, 5]
这是我的代码:
import java.util.*;
public class PermutationGenerator {
Random rand;
ArrayList<Integer> perm = new ArrayList<Integer>();
public PermutationGenerator(int s) {
rand = new Random(s);
}
public void nextPermutation() {
ArrayList<Integer> myArrayList = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++) {
myArrayList.add(i);
}
for (int i = 1; i <= 10; i++) {
int a = rand.nextInt(myArrayList.size());
perm.add(myArrayList.get(a));
myArrayList.remove(a);
}
}
public final String toString() {
return perm.toString();
}
}
我能够通过将 void nextPermutation() 方法更改为 ArrayList、在方法内返回 perm 并从字段中取出 ArrayList 并将其放在 nextPermutation 方法中来获得正确的输出。但是,对于分配,我需要 nextPermutation 为 void,并且我还需要一个 toString 方法。
所以,我的问题是,如何在 toString 中返回 perm 并获得每个列表的一个排列?
【问题讨论】:
-
您只是将整数添加到
perm,并且下次调用nextPermutation()时永远不会清除它。你想要ArrayList<List>吗?我明白这个问题,但不是你想用你的代码做什么。你能展示一个驱动perm人口的主要方法吗? -
当调试类似这样的事情时,您会看到上一次调用的结果与下一次调用的结果相同,它应该向您发出信号,表明您的数据结构可能不会在两次调用之间被清除.
-
是的,就是这样,使用 perm.clear() 来帮助解决这个问题。如果其他人有同样的问题,我会将此解决方案添加到 OP 中。谢谢!