9

我需要在 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 中随机获取一个键,然后返回链接的元素,但我确信这不是解决我的问题的最佳解决方案。

有没有更好的办法?

提前致谢。

4

5 回答 5

15

创建一个Pair同时包含 theInteger和 the的类,String然后将多个Pair对象添加到 List 中,该 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);
于 2013-09-13T08:57:20.717 回答
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;
}
于 2013-09-13T08:57:14.970 回答
2

您可以保留一个单独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
于 2013-09-13T08:53:06.427 回答
0

您可以使用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;
    }
}

我希望它有所帮助。

于 2020-07-04T18:33:47.500 回答
0
Hashtable<Integer, String>

作为不太方便和有效的替代方案List<SomePairClass<Integer, String>>

于 2019-06-25T08:37:39.060 回答