2014-02-28 45 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