web-dev-qa-db-ja.com

シャッフルするKey-Value(整数、文字列)のリストに最適な構造

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をシャッフルすることはできません。

ハッシュマップからランダムにキーを取得し、リンクされた要素を返すこともできますが、これが私の問題に対する最善の解決策ではないと確信しています。

もっと良い方法はありますか?

前もって感謝します。

8
MDT

PairIntegerの両方を保持する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);
12

マップを保持できます。マップはキーで検索されるように設計されているので、シャッフルされたキーのリストを用意することをお勧めします。

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;
}
8
Peter Lawrey

キー値の個別の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
2
Kayaman
Hashtable<Integer, String>

あまり便利で効果的でない代わりにList<SomePairClass<Integer, String>>

0
Oleg Mikhailov