我正在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();是我上面发布的方法。
答案 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);
}