我有一个“令牌”的数组列表。我可以用整数填充它们,没问题。但是,我无法在不使用内置列表类的情况下随机重新排列它们。有什么建议吗?
TopSpinArray<Integer> al = new TopSpinArray<Integer>(numTokens, spinSize);
//fills ArrayList with tokens
for(int i = 1; i <= numTokens; i++) {
al.add(i);
}
答案 0 :(得分:6)
您可以使用以下代码。
public static void shuffleList(List<Integer> a) { int n = a.size(); Random random = new Random(); random.nextInt(); for (int i = 0; i < n; i++) { int change = i + random.nextInt(n - i); swap(a, i, change); } } private static void swap(List<Integer> a, int i, int change) { int helper = a.get(i); a.set(i, a.get(change)); a.set(change, helper); }
请注意,这已从以下链接中复制
http://www.vogella.com/articles/JavaAlgorithmsShuffle/article.html
希望有所帮助
答案 1 :(得分:1)
如果你可以改变你的课程(可能是因为它不是一个列表:那么你可以填充一个列表,随机播放该列表并在你的班级中最终添加这些数据:
final List<Integer> tempList = new ArrayList<Integer>();
//fills ArrayList with tokens
for(int i = 1; i <= numTokens; i++) {
tempList.add(i);
}
Collections.shuffle(tempList);
for(Integer i: tempList) {
al.add(i);
}
答案 2 :(得分:0)
基于@Jabir回答
用于交换任何类型的对象(不仅仅是整数)
public static <T> void shuffleList(List<T> a) {
int n = a.size();
for (int i = 0; i < n; i++) {
int change = i + Random.nextInt(n - i);
swap(a, i, change);
}
}
private static <T> void swap(List<T> a, int i, int change) {
T helper = a.get(i);
a.set(i, a.get(change));
a.set(change, helper);
}