Javaの構造体を実装する必要があります(これはInteger-String型の)Key-Valueリストであり、それをシャッフルしたいと思います。
基本的にはそのようなことをしたいと思います。
public LinkedHashMap<Integer, String> getQuestionOptionsMap(){
LinkedHashMap<Integer, String> shuffle = new LinkedHashMap<Integer, String> ();
if (answer1 != null)
shuffle.put(new Integer(1), answer1);
if (answer2 != null)
shuffle.put(new Integer(2), answer2);
if (answer3 != null)
shuffle.put(new Integer(3), answer3);
if (answer4 != null)
shuffle.put(new Integer(4), answer4);
Collections.shuffle(shuffle);
return shuffle;
}
ただし、HashMapをシャッフルすることはできません。
ハッシュマップからランダムにキーを取得し、リンクされた要素を返すこともできますが、これが私の問題に対する最善の解決策ではないと確信しています。
もっと良い方法はありますか?
前もって感謝します。
Pair
とInteger
の両方を保持するString
クラスを作成してから、複数のPair
オブジェクトをリストに追加し、シャッフルします。
public class Pair {
private Integer integer;
private String string;
//accessors
}
次に:
List<Pair> list = new ArrayList<Pair>();
//...add some Pair objects to the list
Collections.shuffle(list);
マップを保持できます。マップはキーで検索されるように設計されているので、シャッフルされたキーのリストを用意することをお勧めします。
public Map<Integer, String> getQuestionOptionsMap() {
Map<Integer, String> map = new HashMap<>();
String[] answers = {null, answer1, answer2, answer3, answer4};
for (int i = 1; i < answers.length; i++)
if (answers[i] != null)
map.put(i, answers[i]);
List<Integer> order = new ArrayList<>(map.keySet());
Collections.shuffle(order);
Map<Integer, String> shuffled = new LinkedHashMap<>();
for (Integer key : order)
shuffled.put(key, map.get(key));
return shuffled;
}
キー値の個別のList
を保持し、それをシャッフルし、それを使用してHashMap
にアクセスできます。
List<Integer> keys = new ArrayList<Integer>(map.keySet());
Collections.shuffle(keys);
for(Integer i : keys)
map.get(i); // Gets the values in the shuffled order
Hashtable<Integer, String>
あまり便利で効果的でない代わりにList<SomePairClass<Integer, String>>