0

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

4 回答 4

1

Java内置了数组混洗方法,将所有项目放入一个列表中,随机混洗,并获取第一个元素直到它有元素。如果为空,则再次添加所有元素,然后再次洗牌:

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);
}
于 2013-01-22T09:23:26.263 回答
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();
}
于 2013-01-22T08:56:08.663 回答
0

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

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

于 2013-01-22T07:53:04.253 回答
0

数组和列表通常不是为了避免重复而设计的,它们被设计为一种保持许多元素顺序的集合。如果您想要一个更适合该工作的集合,那么您需要一个集合:

 Set<String> set = new HashSet<String>();

以避免重复。

于 2013-01-22T08:11:16.443 回答