2014-02-28 71 views
-1

我正在做一個簡單的隨機測驗應用程序在Android中。所以基本上我有字符串的字符串。我需要顯示沒有重複的字符串。這是我迄今爲止所嘗試的:Android隨機化字符串而不重複

String[] words = { "Welcome", "Different", "Teenager", "Transfer", "Italian", 
        "Timber", "Toxic", "Illiterate", "Irate", "Moderate", "Transportation", "Attention" }; 


ArrayList<String> wordlist = new ArrayList<String>(); 
for (String i : words) 
    wordlist.add(i); 
Collections.shuffle(wordlist); 

randomStr = words[new Random().nextInt(words.length)]; 

tvWord.setText(""); 
tvWord.setText(randomStr); 

但我仍然得到隨機單詞重複。我在這裏做錯了什麼?有任何想法嗎?我很樂意感謝你的幫助。謝謝。

更新:

首先點擊一個按鈕的話那麼應該顯示。很多時候,我點擊按鈕,我又一次收到同樣的字。

switch(v.getId()){ 
    case R.id.btPlay: 
     randomWordList(); 
     break; 
} 

where randomWordList();是我上面發佈的方法。

+0

你洗牌你的數組列表。你可以因此在這之後循環。 – njzk2

回答

2

你不跟蹤哪些已經被使用。我也不明白你爲什麼定義wordlist然後不使用它。只需對代碼進行一些小修改就可以實現。

編輯:您還需要在與使用它的位置不同的範圍內初始化值。例如像這樣:

public class MyClass{ 

LinkedList<String> wordlist; 

public MyClass(){ 
    String[] words = { "Welcome", "Different", "Teenager", "Transfer", "Italian", 
       "Timber", "Toxic", "Illiterate", "Irate", "Moderate", "Transportation", "Attention" }; 
    wordlist = new LinkedList<String>(); 
    for (String i : words) 
     wordlist.add(i); 
    Collections.shuffle(wordlist); 
} 

public void useNextWord(){ 
    tvWord.setText(""); 
    tvWord.setText(wordlist.pollLast()); 
} 
+0

我試過這個,但是當我多次單擊按鈕不斷重複這個詞 – Dunkey

+0

你需要發佈更多。如果這是一種方法,它將無法工作。這些詞需要在別處進行初始化(某些init方法或構造函數)。否則,你正在失去已經使用的信息。 – NeplatnyUdaj

+0

好的會更新我的文章。 – Dunkey

0

您將需要跟蹤您已經在另一個數組或列表中使用過的字符串,並檢查該值是否尚未使用,或者從池中刪除任何已使用的字符串。你可以用String next = List.remove(index)來做到這一點。

+0

對於空間和時間效率來說,跟蹤使用的Ids而不是字符串會更好。 – Tautvydas

0

您首先用Collections.shuffle(wordlist);隨機播放列表,然後使用隨機索引訪問列表。如果列表已經混洗,則不需要使用隨機索引。只需要一個接一個的項目。您可以使用wordlist.remove(0),直到列表爲空。

顯示下一個字符串,如下所示:

if (!wordlist.isEmpty()) { 
    randomStr = wordlist.remove(0); 
    tvWord.setText(randomStr); 
} 
+0

你能舉個例子嗎? – Dunkey

+0

@Dunkey:更新了我的答案。這是您如何檢索並顯示混洗列表中的下一個字符串。該字符串從列表中刪除,因此不會顯示兩次。 – Claus

1

創建的Strings一個新的列表,將它洗。然後簡單地從頭開始遍歷混洗列表。

ArrayList<String> copyOfWords= new ArrayList<String>(words); 
Collections.shuffle(copyOfWords); 

這是從here拍攝。 時間複雜度是O(n)。

要遍歷List,您可以獲取第一個元素並將其刪除(使用相同的方法)或跟蹤哪個元素是最後使用的元素。

解決方案一:

String randomWord = copyOfWords.remove(0); 
tvWord.setText(randomWord); 

附:不要在你的代碼中使用這一行randomStr = words[new Random().nextInt(words.length)];

+0

那麼我怎麼能顯示在我的textview單詞? – Dunkey

+0

更新了答案。希望能幫助到你。 – Tautvydas