0

こんにちは、50 個の文字列を含む文字列配列があり、10 個のランダムな結果のみを選択してテーブル レイアウトに表示したいのですが、結果が 1 つしか表示されないことを除けば、すべて正しく表示されます。ここに私のコードがあります:

private String[] list;
private static final Random rgenerator = new Random();


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.layout1);

Resources res = getResources();
    list = res.getStringArray(R.array.names);
    String q = list[rgenerator.nextInt(list.length)];
int total = 10;

    for (int current = 0; current < total; current++) {
        // Create a TableRow and give it an ID
        TableRow tr = new TableRow(this);
        tr.setId(100 + current);
        tr.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));

        // Create a TextView to house the name of the province
        TextView labelTV = new TextView(this);
        labelTV.setId(200 + current);
        labelTV.setText(q);
        labelTV.setTextSize(14);
        labelTV.setGravity(Gravity.CENTER);
        labelTV.setTextColor(Color.WHITE);
        labelTV.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
        tr.addView(labelTV);

        tablelayout.addView(tr, new TableLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
}

どうしたの?

4

4 に答える 4

0

答えが 1 つしか得られない理由は、ループの外で文字列を取得するため、1 回しか取得できないからです。以下のように見えるはずです。

また、重複を避けたい場合は、それを処理するために何かをする必要があります。java.util.Collections.shuffle() が目的に適している場合は、最初の 10 個のアイテムを取得するだけです。

    int total = 10;

    for (int current = 0; current < total; current++) {
        String q = list[rgenerator.nextInt(list.length)];
        // Create a TableRow and give it an ID
于 2013-10-23T22:10:09.983 に答える
0

これを「ランダムサンプリング」と呼びます。2 つの一般的な手法は次のとおりです。

  • リスト/配列全体を単純にシャッフルし、Collections.shuffle() によって提供されるような公平なシャッフル アルゴリズムを使用してから、最初の n 個の要素を取得します。
  • リストを調べて、乱数がまだ必要なアイテムの数/残っているアイテムの数を表すしきい値を超えるかどうかに基づいて、次のアイテムを含めるかどうかを決定するたびに。

最初の方法を使用する場合は、シャッフルが本当に公平なアルゴリズムであることを確認してください。多くのプログラマーは、シャッフル アルゴリズムをゼロから作成するように求められた場合、それを間違えます。Java の Collections.shuffle() は、その方法の例です。

少し前に私が書いたJava でのランダム サンプリングに関する記事にも興味があるかもしれません。この記事には、2 番目のケースのサンプル スケルトン コードが含まれています。

知識のために、「リザーバーサンプリング」と呼ばれるものを調査することもできますが、可能な50アイテムから10アイテムを選択するのはやり過ぎです.

于 2012-06-05T03:09:03.297 に答える
0

重複を避けるように注意するセットを使用することで、非常に簡単になります。

Set<Integer> uniques = new HashSet<Integer>();

while (uniques.size() < 10)
  uniques.add(rgenerator.nextInt(list.length);

for (Integer i : uniques)
{
  String q = list[i];

  ..
}
于 2012-06-05T02:54:25.863 に答える
0

それが私が思いついたものです..

import java.util.*;
public class RandomStringFromArray
{
    public static void main(String[] args)
    {
        Random rnd = new Random();
        Scanner scan = new Scanner (System.in);
        System.out.println("Enter how many string in the array");
        int x = scan.nextInt();
        ArrayList<String> arraystr = new ArrayList<String>();

        for (int i=0; i < x ; i++)
            {
                System.out.println("Enter elements of the array");
                arraystr.add(scan.next());
            }
        System.out.println("\nI picked: ");

        for ( int t = 0; t < 3; t++) // 3 is how many elements you want to pick
            {

                    int random = rnd.nextInt(x);
                    System.out.println(arraystr.get(random));
                    arraystr.remove(random);
            }

    }
}
于 2013-10-23T21:29:19.340 に答える