要洗牌的键值(整数,字符串)列表的最佳结构

MDT*_*MDT 8 java shuffle hashtable hashmap linkedhashmap

我需要在Java中实现一个键值列表(类型为Integer-String)的结构,我想要将其洗牌.

基本上,我想做那样的事情.

    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;
}
Run Code Online (Sandbox Code Playgroud)

但是,HashMap不能被洗牌.

我可以从hashmap中随机获取一个键,然后返回链接的元素,但我确信这不是我问题的最佳解决方案.

有没有更好的方法?

提前致谢.

Kon*_*kov 12

创建一个Pair类,它同时包含IntegerString,然后将多个Pair对象添加到List,这将被洗牌.

public class Pair {
  private Integer integer;

  private String string;

  //accessors
}
Run Code Online (Sandbox Code Playgroud)

然后:

List<Pair> list = new ArrayList<Pair>();
//...add some Pair objects to the list
Collections.shuffle(list);
Run Code Online (Sandbox Code Playgroud)

  • 然后你不会得到HashMap的O(1)查找. (3认同)
  • 是的,这是正确的,但对于没有那么多物品的Collection,这不会有害. (2认同)

Pet*_*rey 8

你可以保留地图.地图设计为按键查找,所以我建议您有一个随机密钥列表.

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;
}
Run Code Online (Sandbox Code Playgroud)