2013-02-20 127 views

回答

3

最簡單的方法是

positionList[(int) (Math.random() * positionList.length)] = null; 

但這似乎更接近你想要什麼

String[] a = { "1", "2", "3", "4" }; 
    List<Integer> positions = new ArrayList<>(a.length); 
    for (int i = 0; i < a.length; i++) { 
     positions.add(i); 
    } 
    Collections.shuffle(positions); 
    while(!positions.isEmpty()) { 
     int i = positions.remove(positions.size() - 1); 
     System.out.println(i); 
    } 
+0

那也能夠將選定的字符串存儲到位,然後使其爲空? – Ryan 2013-02-20 06:52:01

+0

這可能是最簡單的方法,但效率非常低。考慮一下你只剩下一個非空索引的情況。然後它可能需要隨機數生成器運行多次才能獲得該索引。 – 2013-02-20 07:08:41

+0

猜測給定數組長度爲「100」的情況下,從'(int)(Math.random()* positionList.length)'得到索引'5'的概率是多少?這就是問題。 – 2013-02-20 07:13:49

4

刪除會如果您使用ArrayList而不是array,則更好。因爲在數組的情況下,你將不得不重新調整它的大小(這意味着,你必須每次創建一個新的數組 - 致命的想法,避免它),或將選擇的索引設置爲null

但是這種方法(設置null)的問題是,您可能必須多次進行隨機選擇才能獲得一個有效的隨機索引,尤其是當您僅剩下有效索引1時。因此,最好使用List,並從中刪除選定的元素。

List<String> list = new ArrayList<String>(); 

// Populate your list. 

Collections.shuffle(list);  // Shuffle the list. 
String random = list.remove(0); // Will remove the first element 

需要注意的是,如果你希望你的原始ArrayList,後一個,那麼很可能你可以讓一個副本。

0

我會說你基本上有三種選擇。

  1. 請勿使用數組。您可以使用列表來代替它,它可以讓您輕鬆刪除元素
  2. 將數組元素設置爲null,如其他答案中的建議
  3. 跟蹤您在某種數據結構中選擇的陣列位置並在每次生成隨機數時檢查它。
0

首先,您需要了解Java中的數組具有不可變的長度。如果您創建一個包含5個元素/插槽的陣列,它將始終有5個元素。你不能改變這一點。

所以你幾乎不能刪除數組的第i個元素。你可以做的是下列之一:

  • 您可以在位置設置i的元素null(假設這是對象的數組)。

  • 您可以創建一個新陣列,該陣列由舊陣列的元素組成,除了您正在「刪除」的元素之外。但是請注意,你並不是實際上是改變原來的數組。

還有第三個選項。根本不要使用數組。改爲使用List;例如一個ArrayList或可能是一個LinkedList取決於您的應用程序的要求。該API允許您將元素添加到列表中,並從列表中刪除元素...以及更多內容。

(使用ArrayList,而不是一個數組是,前者需要稍微更大的空間,是或多或少地更慢的缺點,但它是不太可能的事情,除非空間使用和/或性能都關鍵關注您的應用程序。 )

+0

將選定的字符串存儲到位,然後將其設置爲null在數組內?如果我想走這條路,我需要爲整個數組做一個字符串比較? – Ryan 2013-02-20 07:07:27

+0

@Ryan。是的,這可能是可能的,但不要這樣做。爲什麼?看到我對第一個答案的評論。 – 2013-02-20 07:12:11