Reputation: 1659
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.
Upvotes: 9
Views: 119846
Reputation: 1123
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.
Upvotes: 0
Reputation: 6081
Hashtable<Integer, String>
As an alternative to less convenient and effective List<SomePairClass<Integer, String>>
Upvotes: 0
Reputation: 533502
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;
}
Upvotes: 8
Reputation: 73548
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
Upvotes: 2
Reputation: 62864
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);
Upvotes: 15