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 に答える