我從數組中隨機選擇一個字符串,在選擇它之後,我想使它不能再次選擇該字符串。我應該「刪除」它還是有更好的方法?如何在隨機選擇數組後從數組中刪除字符串? Java
這裏是我的代碼隨機選擇它,
position = positionList[(int) (Math.random() * positionList.length)];
我從數組中隨機選擇一個字符串,在選擇它之後,我想使它不能再次選擇該字符串。我應該「刪除」它還是有更好的方法?如何在隨機選擇數組後從數組中刪除字符串? Java
這裏是我的代碼隨機選擇它,
position = positionList[(int) (Math.random() * positionList.length)];
最簡單的方法是
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);
}
刪除會如果您使用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
,後一個,那麼很可能你可以讓一個副本。
我會說你基本上有三種選擇。
首先,您需要了解Java中的數組具有不可變的長度。如果您創建一個包含5個元素/插槽的陣列,它將始終有5個元素。你不能改變這一點。
所以你幾乎不能刪除數組的第i個元素。你可以做的是下列之一:
您可以在位置設置i的元素null
(假設這是對象的數組)。
您可以創建一個新陣列,該陣列由舊陣列的元素組成,除了您正在「刪除」的元素之外。但是請注意,你並不是實際上是改變原來的數組。
還有第三個選項。根本不要使用數組。改爲使用List
;例如一個ArrayList
或可能是一個LinkedList
取決於您的應用程序的要求。該API允許您將元素添加到列表中,並從列表中刪除元素...以及更多內容。
(使用ArrayList
,而不是一個數組是,前者需要稍微更大的空間,是或多或少地更慢的缺點,但它是不太可能的事情,除非空間使用和/或性能都關鍵關注您的應用程序。 )
將選定的字符串存儲到位,然後將其設置爲null在數組內?如果我想走這條路,我需要爲整個數組做一個字符串比較? – Ryan 2013-02-20 07:07:27
@Ryan。是的,這可能是可能的,但不要這樣做。爲什麼?看到我對第一個答案的評論。 – 2013-02-20 07:12:11
那也能夠將選定的字符串存儲到位,然後使其爲空? – Ryan 2013-02-20 06:52:01
這可能是最簡單的方法,但效率非常低。考慮一下你只剩下一個非空索引的情況。然後它可能需要隨機數生成器運行多次才能獲得該索引。 – 2013-02-20 07:08:41
猜測給定數組長度爲「100」的情況下,從'(int)(Math.random()* positionList.length)'得到索引'5'的概率是多少?這就是問題。 – 2013-02-20 07:13:49