【问题标题】:Best structure for list of key-value (integer, string) to be shuffled要混洗的键值(整数,字符串)列表的最佳结构
【发布时间】:2013-09-13 08:51:59
【问题描述】:

我需要在 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;
}

但是,HashMap 不能被洗牌。

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

有没有更好的办法?

提前致谢。

【问题讨论】:

  • 您希望整数作为键还是字符串作为键,因为您在代码中都有这两种方式。如果你想洗牌,你需要一个列表。
  • 对不起,我更正了上面的代码。键是整数,值是字符串(我的答案的文本)。
  • 谢谢我看到了那个帖子,但我不想修改键和值。我只想随机获取一对(键值)。

标签: java hashmap hashtable shuffle linkedhashmap


【解决方案1】:

创建一个Pair 类,它同时包含IntegerString,然后将多个Pair 对象添加到一个List 中,这将被打乱。

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);

【讨论】:

  • 那么你不会得到 HashMap 的 O(1) 查找。
  • 谢谢,我选择了这个解决方案,将我的 Pair 类实现为我的主类中的一个类。
【解决方案2】:

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

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;
}

【讨论】:

    【解决方案3】:

    您可以保留一个单独的 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
    

    【讨论】:

    • 是的,这就是我在问题结尾处写的,但我不确定这是最好的选择。谢谢。
    【解决方案4】:
    Hashtable<Integer, String>
    

    作为不太方便和有效的List&lt;SomePairClass&lt;Integer, String&gt;&gt;的替代方法

    【讨论】:

    • 也许一些解释会有用?
    【解决方案5】:

    你可以使用enum来实现这个,例子

    package device.packet.data;
    
    public enum TLVList {
        
        SpeedingAlarm(0x1001, 3, Short.class),
        LowVoltageAlarm(0x1002, 3, Short.class),
        OBDCommunicationError(0x1015, 3, Short.class),
        IgnitionOn(0x1016, 3, Short.class),
        IgnitionOff(0x1017, 3, Short.class),
        MILAlarm(0x1018, 3, Short.class),
        UnlockAlarm(0x1019, 3, Short.class),
        NoCardPresented(0x101A, 3, Short.class),
        HiddenCommand(0x101B, 3, Short.class),
        Vibration(0x101C, 3, Short.class),
        DoorOpened(0x101D, 3, Short.class);
        
        private int tagFlagHex;
        private int length;
        private Class aClass;
    
        public int gettagFlagHex() {
            return tagFlagHex;
        }
    
        public int getLength() {
            return length;
        }
    
        public Class getClassType() {
            return aClass;
        }
    
        TLVList(int tagFlagHex, int length, Class aClass) {
    
            this.tagFlagHex = tagFlagHex;
            this.length = length;
            this.aClass = aClass;
        }
    
        public static TLVList of(Integer tagFlagHex) {
            for (TLVList tagFlag : TLVList.values()) {
                if(tagFlag.tagFlagHex == tagFlagHex) return tagFlag;
            }
            return null;
        }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      相关资源
      最近更新 更多