配列から文字列をランダムに選択していますが、選択した後、その文字列を再度選択できないようにしたいと考えています。「削除」する必要がありますか、それともより良い方法がありますか?
ランダムに選択するコードは次のとおりです。
position = positionList[(int) (Math.random() * positionList.length)];
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
元の、後のものが必要な場合は、おそらくコピーを作成できることに注意してください。
最も簡単な方法は
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);
}
まず、Java の配列の長さは不変であることを理解する必要があります。5 つの要素 / スロットを持つ配列を作成すると、常に 5 つの要素になります。それを変更することはできません。
したがって、文字通り、配列の i 番目の要素を削除することはできません。できることは、次のいずれかです。
位置 i の要素を設定できますnull
(これがオブジェクトの配列であると仮定します)。
「削除」する配列とは別に、古い配列の要素で構成される新しい配列を作成できます。ただし、実際には元の配列を変更していないことに注意してください。
3 つ目のオプションがあります。配列をまったく使用しないでください。List
代わりにaを使用してください。たとえば、アプリケーションの要件に応じて、ArrayList
またはおそらく aです。LinkedList
この API を使用すると、リストに要素を追加したり、リストから要素を削除したりできます。他にも多くのことができます。
(配列ではなく a を使用することの欠点はArrayList
、前者がわずかに多くのスペースを必要とし、わずかに遅くなることです。ただし、スペースの使用やパフォーマンスがアプリケーションにとって重大な問題でない限り、問題になることはほとんどありません。)
基本的に3つの選択肢があると思います。