我有一個包含一組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',遍歷列表。 –