Android随机化字符串而不重复

时间:2014-02-28 17:08:43

标签: java

我正在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;
 }

其中randomWordList();是我上面发布的方法。

4 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:1)

创建Strings的新列表并将其随机播放。然后简单地从头开始遍历洗牌列表。

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

这取自here。 时间复杂度为O(n)。

要迭代List,您可以获取第一个元素并将其删除(使用相同的方法)或跟踪哪个是最后使用的元素。

第一个解决方案:

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

P.S。请勿在代码randomStr = words[new Random().nextInt(words.length)];

中使用此行

答案 2 :(得分:0)

您需要跟踪已在另一个数组或列表中使用过的字符串,并检查尚未使用的值,或者从池中删除任何使用过的字符串。您可以使用String next = List.remove(index)

执行此操作

答案 3 :(得分:0)

首先使用Collections.shuffle(wordlist);随机播放列表,然后使用随机索引访问列表。如果列表已经洗牌,则无需使用随机索引。只需一个接一个的项目。您可以使用wordlist.remove(0),直到列表为空。

显示下一个字符串,如下所示:

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