2011-10-16 127 views
1

我在做賓果型遊戲。我有一個5x5的圖像按鈕,每個都有自己的textview。當應用程序啓動或重置時,我希望每個文本視圖顯示一個隨機字符串,而不會在遊戲過程中顯示任何一個字符串兩次。我現在有一個字符串在資源數組,其中127個項目:Android隨機不重複字符串

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string-array name="tile_text"> 
    <item>String 1</item> 
    <item>String 2</item> 
    <item>String 3</item> 
    ...all the way to String 127 
</string-array> 
</resources> 

,並顯示每個TextView的一個隨機字符串:

public String[] myString; 

Resources res = getResources(); 
myString = res.getStringArray(R.array.tile_text); 

Random random = new Random(System.currentTimeMillis()); 

int[] textViews = { 

//I have all my textviews added to this array 
}; 

for(int v : textViews) { 
     TextView tv = (TextView)findViewById(v); 

     tv.setText(myString[random.nextInt(myString.length)]);   
} 

上述效果很好,但即使有200串數組可供選擇,有些項目仍顯示兩次。有沒有一種方法可以讓陣列洗牌,而不是每場比賽兩次選擇相同的字符串?我已經搜索,我發現隨機字符串的信息,但沒有關於非重複的隨機字符串,所以,如果這是一個重複的問題道歉。

回答

1

我會保留一個你已經添加的字符串列表,然後繼續選擇新的隨機字符串,直到找到一個不在列表中的字符串。

事情是這樣的:

Vector<String> alreadyUsed = new Vector<String>(); 

for(int v : textViews) { 
    TextView tv = (TextView)findViewById(v); 

    String nextString; 
    do { 
     nextString = myString[random.nextInt(myString.length)];     
    } while (alreadyUsed.contains(nextString)); 
    alreadyUsed.add(nextString); 

    tv.setText(nextString);   
} 
+0

謝謝,正是我一直在尋找!我還在for循環之外添加了alreadyUsed.clear(),以便它可以從所有字符串中再次選擇每個新遊戲,但它不會在每場比賽中多次添加相同的字符串。 – heavy5rescue