2015-10-07 48 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