2015-10-07 49 views
0

我有一个包含一组Points和一个Timer的数组。Java:从阵列中检索随机,非重复元素One-by-One

我想从定时器触发每个操作事件从数组中获得一个随机点。这里的问题是我需要每个迭代都有一个不同的值,这意味着我不希望两次获得相同的点。

有什么建议吗?

+1

用数组中的所有索引创建一个List。从列表中获取一个随机元素,从列表中删除这个数字并重复它。 – SomeJavaGuy

+0

将你的数组复制到一个'ArrayList'中,以该列表作为参数调用'Collections.shuffle',遍历列表。 –

回答

0

你可以使用List,shuffle它,然后迭代。

List<Point> pointsList = Arrays.asList(yourArray); 
long seed = System.nanoTime(); 
Collections.shuffle(pointsList, new Random(seed)); 
+0

如果您使用原始类型列表,那么您可以简单地删除通用。逻辑保持不变。 – javatutorial

+0

感谢您的解决方案,它很简单,并按预期工作! – Centro

0

您可以使用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(与非重复元件)。

0

尽管如此,你也可以用数组中的每个索引创建一个简单列表。一个微小的例子可能是这样工作的:

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; 
} 
+0

感谢您的解决方案,但它有点矫枉过正;)Collections.shuffle()和遍历列表工作得很好。 – Centro