【问题】
用如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | @Override public RadioGroupField Get(EddlVariable var) { RadioGroupField radio = new RadioGroupField(); radio.setFieldName(var.Name); HashMap<String, String> options = new HashMap<String, String>(); for (Enumerated value : type.Enumerateds) { //Enumerated value = type.Enumerateds.get(itemIdx); Enumerated refEnumerated = MapRefEnumerated(value); if (refEnumerated == null ) { options.put(value.value, value.description); } else { options.put(refEnumerated.value, refEnumerated.description); } } radio.setOptionsValue(options); return radio; } private HashMap<String, String> options = new HashMap<String, String>(); public void setOptionsValue(Object options) { this .options = (HashMap<String, String>) options; } @Override public View getInputView(Context activity) { if ( this .group == null ) { this .group = new RadioGroup(activity); } else { this .group.removeAllViews(); } Iterator<Entry<String, String>> iterator = this .options.entrySet() .iterator(); while (iterator.hasNext()) { RadioButton radio = new RadioButton(activity); Entry<String, String> pair = iterator.next(); radio.setTag(pair.getKey()); radio.setText(pair.getValue()); this .group.addView(radio); } |
处理的内容是:
1 | {0="Current loop", 1="Local display", 2="HART"} |
结果最后,输出顺序却反了:
1 | {2="HART", 1="Local display", 0="Current loop"} |
想要实现:
对于put进去的内容的顺序,输出时,也是同样的顺序。
【折腾过程】
1.参考:
Put keys in hashmap and retrieve in same order
->
Order of values retrieved from a HashMap
去试试,
最后用如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | @Override public RadioGroupField Get(EddlVariable var) { RadioGroupField radio = new RadioGroupField(); radio.setFieldName(var.Name); //HashMap<String, String> options = new HashMap<String, String>(); LinkedHashMap<String, String> options = new LinkedHashMap<String, String>(); for (Enumerated value : type.Enumerateds) { //Enumerated value = type.Enumerateds.get(itemIdx); Enumerated refEnumerated = MapRefEnumerated(value); if (refEnumerated == null ) { options.put(value.value, value.description); } else { options.put(refEnumerated.value, refEnumerated.description); } } radio.setOptionsValue(options); return radio; } //private HashMap<String, String> options = new HashMap<String, String>(); //HashMap will cause: output sequence not same with input sequence -> enumerated value sequence is reversed when show in GUI private LinkedHashMap<String, String> options = new LinkedHashMap<String, String>(); public void setOptionsValue(Object options) { //this.options = (HashMap<String, String>) options; this .options = (LinkedHashMap<String, String>) options; } @Override public View getInputView(Context activity) { if ( this .group == null ) { this .group = new RadioGroup(activity); } else { this .group.removeAllViews(); } Iterator<Entry<String, String>> iterator = this .options.entrySet() .iterator(); while (iterator.hasNext()) { RadioButton radio = new RadioButton(activity); Entry<String, String> pair = iterator.next(); radio.setTag(pair.getKey()); radio.setText(pair.getValue()); this .group.addView(radio); } |
最终实现了要的效果:
输入的顺序:
1 2 3 | { 0, "Current loop" }, { 1, "Local display" }, { 2, "HART" } |
和输出的效果,是一致的:
【总结】
HashMap无法保证,输出顺序和输入顺序一致;
改为LinkedHashMap,即可保证,输出顺序和输入顺序一致。
转载请注明:在路上 » 【已解决】HashMap输出的项的顺序不固定