2012-01-30 34 views
6

我有一个HashMap<String,String>,并且有一个静态方法将此映射返回到Activity如何使用ArrayAdapter对Android中添加的HashMap进行排序

方法是这样的:

public static HashMap<String, String> getAll() {  
    HashMap<String, String> map = new HashMap<String,String>(); 

    map.put("ab", "value1"); 
    map.put("bc", "value2"); 
    map.put("de", "value3"); 

    return map; 
} 

我想使用地图的好手。因此,活动如下所示:

List list = new ArrayList<String>(); 
HashMap<String, String> map = Constants.getAll(); 

for (String key : map.keySet()) { 
    list.add(Constants.getAll().get(key).toString()); 
} 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list); 
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

spinTest = (Spinner)findViewById(R.id.spinTest); 

spinTest.setOnItemSelectedListener(new OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     urlDebug.setText(list.get(arg2).toString()); 
    } 

    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 

spinTest.setAdapter(adapter); 

当我尝试运行我的应用程序时,根本没有问题。但是当我点击微调框时,项目没有按照我在getAll()方法上添加的顺序进行排序。我的意思是,命令必须是ab - bc -de,但它是随机排列的。

什么是不正确的?

回答

6

在散列图中,插入顺序不被维护,所以最后插入的项可能首先被访问。如果要维护插入顺序,请改为使用linkedhashmap。

+0

现在,我添加的订单,谢谢。 – 2012-01-30 09:30:16

+0

或者,只需使用TreeMap。这就是你知道的。 – Jens 2012-01-30 12:12:21

+0

你刚刚救了我的小时! – 2015-01-19 04:36:05

2

更新:通过回答jitendra sharma是最好的: 如果您只需要保持原始插入顺序,树图的成本比链接的阴影图要多得多,并且不会为您的项目添加任何内容。

散列图无法排序。这是他们效率的一部分。

如果您需要排序,请使用TreeMap

祝你好运。

+0

对于正常数量的项目,TreeMap不是特别低效 - 考虑到显然只有很少的项目可以使用微调器。 – Jens 2012-01-30 12:14:16

+0

我刚刚添加了更新,以确保未来的读者知道什么期望和良好的做法。从Oracle Java文档:“该实现将客户端从HashMap(和Hashtable)提供的未指定的,通常混乱的排序中排除,而不会增加与TreeMap相关的成本增加”:http://docs.oracle.com/javase/1.4 0.2 /文档/ API/JAVA/UTIL/LinkedHashMap.html – Yahel 2012-01-30 13:01:25

0

在对列表排序后,您应该调用adapter.notifyDataSetChanged()或spinTest.setAdapter(adapter)。

spinTest.setOnItemSelectedListener(new OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     urlDebug.setText(list.get(arg2).toString()); 
    } 

    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 

spinTest.setAdapter(adapter); 
// TODO: Sort the list 
// Some code here 
adapter.notifyDataSetChanged(); 
相关问题