我有一个包含一组Points和一个Timer的数组。Java:从阵列中检索随机,非重复元素One-by-One
我想从定时器触发每个操作事件从数组中获得一个随机点。这里的问题是我需要每个迭代都有一个不同的值,这意味着我不希望两次获得相同的点。
有什么建议吗?
我有一个包含一组Points和一个Timer的数组。Java:从阵列中检索随机,非重复元素One-by-One
我想从定时器触发每个操作事件从数组中获得一个随机点。这里的问题是我需要每个迭代都有一个不同的值,这意味着我不希望两次获得相同的点。
有什么建议吗?
你可以使用List,shuffle
它,然后迭代。
List<Point> pointsList = Arrays.asList(yourArray);
long seed = System.nanoTime();
Collections.shuffle(pointsList, new Random(seed));
如果您使用原始类型列表,那么您可以简单地删除通用
感谢您的解决方案,它很简单,并按预期工作! – Centro
您可以使用Collections.shuffle(List)
,你可以得到与Arrays.asList(T...)
一个数组支持的List
。像,
Integer[] arr = new Integer[] { 1, 2, 3 };
Collections.shuffle(Arrays.asList(arr));
System.out.println(Arrays.toString(arr));
这将显示在一个随机的顺序在阵列arr
(与非重复元件)。
尽管如此,你也可以用数组中的每个索引创建一个简单列表。一个微小的例子可能是这样工作的:
public static void main(String[] args) {
Integer[] numbers = {1,2,3,4,5,6,7,8,9,10};
List<Integer> list = new ArrayList<Integer>(numbers.length);
for(int i = 0;i<numbers.length;++i) {
list.add(i);
}
}
private static int returnRandomNumber(List<Integer> list) {
Random r = new Random();
if(list.size() == 0) {
return -1; // maybe throw an exception
}
int index = r.nextInt(list.size());
int number = list.get(index);
list.remove(index);
return number;
}
感谢您的解决方案,但它有点矫枉过正;)Collections.shuffle()和遍历列表工作得很好。 – Centro
用数组中的所有索引创建一个List。从列表中获取一个随机元素,从列表中删除这个数字并重复它。 – SomeJavaGuy
将你的数组复制到一个'ArrayList'中,以该列表作为参数调用'Collections.shuffle',遍历列表。 –