문제

I need to implement a structure in Java that is a key-value list (of types Integer-String) and I want to shuffle it.

Basically, I would like to do something like that.

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

However, HashMap cannot be shuffled.

I could randomly get a key from the hashmap, and then return the linked element, but I'm sure this is not the best solution for my problem.

Is there any better way?

Thanks in advance.

도움이 되었습니까?

해결책

Create a Pair class, that holds both the Integer and the String and then add multiple Pair objects to a List, which will be shuffled.

public class Pair {
  private Integer integer;

  private String string;

  //accessors
}

Then:

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

다른 팁

You can keep the Map. The Map is designed to be looked up by key so I suggest you have a list of shuffled keys.

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

You could keep a separate List of the keyvalues, shuffle that and use it to access the 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>

As an alternative to less convenient and effective List<SomePairClass<Integer, String>>

You can use enum to achieve this, example

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

I hope it helps.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top