我喜欢随机地将字符串数组中的一些字符串显示到Textview中。我正在使用以下代码,但问题是大多数情况下反复显示一些字符串。我想要的是一次显示的字符串不应再显示。我花了几个小时搜索代码,但没有他们为我工作。请帮助。提前谢谢。
public void GetQuotes(View view) {
Resources res = getResources();
myString = res.getStringArray(R.array.Array);
String q = myString[rgenerator.nextInt(myString.length)];
TextView tv = (TextView)findViewById(R.id.textView1);
tv.setText(q);
答案 0 :(得分:1)
Java内置了数组shuffling方法,将所有项目放入列表中,随机随机播放,获取第一个元素直到它有元素。如果为空,请再次添加所有元素,然后再次随机播放:
private List<String> myString;
public void GetQuotes(View view) {
Resources res = getResources();
if (myString==null || myString.size()==0) {
myString = new ArrayList<String>();
Collections.addAll(myString, res.getStringArray(R.array.Array));
Collections.shuffle(myString); //randomize the list
}
String q = myString.remove(0);
TextView tv = (TextView)findViewById(R.id.textView1);
tv.setText(q);
}
答案 1 :(得分:0)
我建议手动检查以前是否使用过它,或者使用一个集合,然后在该集合中写入字符串。
答案 2 :(得分:0)
通常,数组和列表不是为避免重复而设计的,它们被设计为一种集合,可以维护许多元素的顺序。如果你想要一个更适合这份工作的系列,你需要一套:
Set<String> set = new HashSet<String>();
避免重复。
答案 3 :(得分:0)
现在,当我说这个舌头时,如果你想要一个简单的解决方案,你可以有一个专用的字符串变量来存储最后使用过的问题。然后,如果将其初始化为空字符串,则变得非常简单。假设变量最后被调用。
String q = myString[rgenerator.nextInt(myString.length)];
//q has a string which may or may not be the same as the last one
//the loop will go on until this q is different than the last
//and it will not execute at all if q and last are already different
while (last.equals(q))
{
//since q and last are the same, find another string
String q = myString[rgenerator.nextInt(myString.length)];
};
//this q becomes last for the next time around
last = q;
现在在其他几个问题中,要记住的一个关键事项是,这只能确保q [1]不能跟随q [1],但它并不完全避免一种情况,只是为了荒谬,说q [1],q [2],q [1],q [2]等。
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
for (int i = 0; i < myString.length)
{
list1.add(myString[i]);
}
q = (String)list1.get(rgenerator.nextInt(list1.size()));
list1.remove(q);
list2.add(q);
if (list1.isEmpty())
{
list1.addAll(list2);
list2.clear();
}