如何避免随机字符串重复出现

时间:2013-01-22 07:46:03

标签: android random repeat arrays

我喜欢随机地将字符串数组中的一些字符串显示到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);  

4 个答案:

答案 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)

我建议手动检查以前是否使用过它,或者使用一个集合,然后在该集合中写入字符串。

http://developer.android.com/reference/java/util/Set.html

答案 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]等。

这是一个同样简单的ArrayList。

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();
}