0

配列から文字列をランダムに選択していますが、選択した後、その文字列を再度選択できないようにしたいと考えています。「削除」する必要がありますか、それともより良い方法がありますか?

ランダムに選択するコードは次のとおりです。

position = positionList[(int) (Math.random() * positionList.length)];
4

4 に答える 4

5

ArrayListの代わりにを使用する場合は、削除することをお勧めしますarray。配列の場合、サイズを変更する必要があるため (つまり、毎回新しい配列を作成する必要があります -致命的なアイデアです。避けてください)、選択したインデックスを に設定する必要がありますnull

ただし、このアプローチ (設定null) の問題は、特に有効なインデックスしか残っていない場合に、1 つの有効なランダム インデックスを取得するために、ランダムな選択を何度も行う必要がある場合があること1です。したがって、を使用してList、選択した要素を削除することをお勧めします。

List<String> list = new ArrayList<String>();  

// Populate your list.

Collections.shuffle(list);        // Shuffle the list.
String random = list.remove(0);   // Will remove the first element

ArrayList元の、後のものが必要な場合は、おそらくコピーを作成できることに注意してください。

于 2013-02-20T06:51:15.460 に答える
3

最も簡単な方法は

positionList[(int) (Math.random() * positionList.length)] = null;

しかし、これはあなたが望むものに近いようです

    String[] a = { "1", "2", "3", "4" };
    List<Integer> positions = new ArrayList<>(a.length);
    for (int i = 0; i < a.length; i++) {
        positions.add(i);
    }
    Collections.shuffle(positions);
    while(!positions.isEmpty()) {
        int i = positions.remove(positions.size() - 1);
        System.out.println(i);
    }
于 2013-02-20T06:49:40.763 に答える
0

まず、Java の配列の長さは不変であることを理解する必要があります。5 つの要素 / スロットを持つ配列を作成すると、常に 5 つの要素になります。それを変更することはできません。

したがって、文字通り、配列の i 番目の要素を削除することはできません。できることは、次のいずれかです。

  • 位置 i の要素を設定できますnull(これがオブジェクトの配列であると仮定します)。

  • 「削除」する配列とは別に、古い配列の要素で構成される新しい配列を作成できます。ただし、実際には元の配列を変更していないことに注意してください。

3 つ目のオプションがあります。配列をまったく使用しないでください。List代わりにaを使用してください。たとえば、アプリケーションの要件に応じて、ArrayListまたはおそらく aです。LinkedListこの API を使用すると、リストに要素を追加したり、リストから要素を削除したりできます。他にも多くのことができます。

(配列ではなく a を使用することの欠点はArrayList、前者がわずかに多くのスペースを必要とし、わずかに遅くなることです。ただし、スペースの使用やパフォーマンスがアプリケーションにとって重大な問題でない限り、問題になることはほとんどありません。)

于 2013-02-20T06:57:44.397 に答える
0

基本的に3つの選択肢があると思います。

  1. 配列を使用しないでください。代わりにリストを使用して、要素を簡単に削除できます
  2. 他の回答で提案されているように、配列要素を null に設定します
  3. これまでに選択した配列の位置をある種のデータ構造で追跡し、乱数を生成するたびに確認します。
于 2013-02-20T06:53:14.540 に答える