最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】HashMap输出的项的顺序不固定

Java crifan 3877浏览 0评论

【问题】

用如下代码:

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

和输出的效果,是一致的:

output emumerated value as expected input sequence

 

【总结】

HashMap无法保证,输出顺序和输入顺序一致;

改为LinkedHashMap,即可保证,输出顺序和输入顺序一致。

转载请注明:在路上 » 【已解决】HashMap输出的项的顺序不固定

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.400 seconds, using 22.19MB memory