項目 (名前) の 1 つのリストからペアを選択する必要があるコードのセグメントを含むプログラムを作成しています。
ArrayList<String>
最初のリストは、人々の一意の名前をすべて含む単一のリストから取得されます。
私の試みは次のとおりです。
//Performance is not really a focus as the lists are small (20 ~ 60 elements),
//thus I use a SecureRandom instead of a Random.
SecureRandom rnd = new SecureRandom();
//List of names
ArrayList<String> Names = new ArrayList<>();
//Names populated somewhere here..
//Make a secondary array which houses the available names...
ArrayList<String> AvailNames = new ArrayList<>();
AvailNames.addAll(Names);
LinkedHashMap<String, String> NamePair = new LinkedHashMap<>();
Iterator<String> Iter = Names.iterator();
// LOOP A
while(Iter.hasNext()){
String name = Iter.next();
int index;
/*
* LOOP B
* Find a unique pair randomly, looping if the index is the same.
* Not the most efficient way, but gets the job done...
*/
while(true){
index = rnd.nextInt(AvailNames.size());
if(!AvailNames.get(index).equals(name)){
break;
}
}
NamePair.put(name, AvailNames.remove(index));
}
名前の数が奇数の場合、LOOP B
(上記を参照) が無期限に実行されるという問題に遭遇します。
問題は、すべてのペアが取得されたときに、残っている最後の名前のペアが一意ではないことがあり、if ステートメントが真にならないことがあるという事実にあることがわかりました。
たとえば、次のリストを見てください。
- あ
- B
- ハ
- D
- え
プログラムは、実行中に A から D をソートして、次のような名前のペアを作成します。
- A - B
- B - C
- CD
- D - C
これはE - E
、ペアとして許可されていない最終的なペアとして残ります (アイテム/名前が一意ではないため)。ペアの割り当てはランダムなので、うまくいくこともあればうまくいかないこともあり、率直に言って非常に面倒です...
解決策は非常に簡単だと確信していますが、何らかの理由でこの問題を回避する方法が見つからないようです。どんな助けでも大歓迎です。