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

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

Java crifan 3776浏览 0评论

【问题】

用如下代码:

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

处理的内容是:

{0="Current loop", 1="Local display", 2="HART"}

结果最后,输出顺序却反了:

{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

去试试,

最后用如下代码:

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

最终实现了要的效果:

输入的顺序:

    {   0, "Current loop" }, 
    {   1, "Local display"  }, 
    {   2, "HART"  }

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

output emumerated value as expected input sequence

 

【总结】

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

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

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

发表我的评论
取消评论

表情

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

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