2013-03-26 99 views
1

的名單我有一個被填充像這樣排序地圖

map.put("firstName",John); 
map.put("lastName",Smith); 
map.put("type","1"); //type is either 1 or a 0 

people.add(map); 

,我希望它被填充後,與此列表做的是這樣的地圖

List<Map<String, Object>> people = new ArrayList<Map<String,Object>>();

列表將所有人的類型0放在列表頂部,並且所有人的底部都是1

我知道我需要使用Comparator,但我從來沒有使用過一個,所以我不知道如何使用一個或它如何工作。

有人能幫助我

+0

落實'比較#比較()'方法來在關鍵'type'檢查每個地圖上的價值和基於回報在1或0. – 2013-03-26 14:54:19

+8

你爲什麼用Map來表示人的信息?創建自己的Person類和使用列表像這樣的'List '不是更簡單嗎? – Pshemo 2013-03-26 14:55:01

+0

@Pshemo是的,但這是Android的東西填充列表,需要該列表適配器的地圖列表 – tyczj 2013-03-26 14:56:54

回答

4

像這樣

Collections.sort(people, new Comparator<Map<String, Object>>() { 
    @Override 
    public int compare(Map<String, Object> o1, Map<String, Object> o2) { 
     return (Integer.parseInt((String)o1.get("type"))) - 
       (Integer.parseInt((String)o2.get("type"))); 
    } 
}); 

然而,有許多方法可以使這更好的。如果您不能像@Pshemo所建議的那樣使用Person對象來表示地圖,則至少需要爲您的類型屬性使用合理的數據類型。最好的是一個枚舉:

public enum PersonType { 
    TYPE_1, TYPE_2 
} 

然後,比較是更乾淨,更快,更可讀。

+1

因爲'o1.get'的結果類型是Object - >'Map ',所以你需要在'o1.get(「type」)附近添加強制類型轉換爲String。 – Pshemo 2013-03-26 15:11:17

+0

@Pshema,修正,謝謝你的糾正。只是去顯示你可以在沒有編譯器的情況下完成:(... – Lucas 2013-03-26 16:04:47

2

比較僅僅是一個需要實現的接口,它僅包含一個需要被重寫方法。

例如:

List<Map<String, Object>> people = new ArrayList<Map<String,Object>>(); 

    Map<String, Object> map = new HashMap<String, Object>(); 
    map .put("firstName","John"); 
    map.put("lastName","Smith"); 
    map.put("type","1"); //type is either 1 or a 0 

    people.add(map); 

    Collections.sort(people, new Comparator<Map<String, Object>>() { 
     @Override 
     public int compare(Map<String, Object> o1, Map<String, Object> o2) { 
      // you may compare your map here 
      return 0; 
     } 
    }); 
2

試試這個

Collections.sort(people, new Comparator<Map<String, String>>() { 

    @Override 
    public int compare(Map<String, String> m1, Map<String, String> m2) { 
     return m1.get("type").compareTo(m2.get("type")); 
    } 
}); 
1

你可以嘗試這樣的:

class ListByType 
{ 
    private static class MyComparator implements Comparator<HashMap<String,String>> 
    { 
     @Override 
     public int compare(HashMap mp1 , HashMap mp2) 
     { 
      return ((String)(mp1.get("type")).compareTo((String)mp2.get("type")); 
     } 
    } 
    public static void main(String[] args) 
    { 
     List<Map<String, String>> people = new ArrayList<Map<String,String>>(); 
     HashMap<String,String> map = new HashMap<String,String>(); 
     map.put("firstName","John"); 
     map.put("lastName","Smith"); 
     map.put("type","1"); //type is either 1 or a 0 
     people.add(map); 
     /*... 
     .. 
     ... 
     Add more maps here.. 
     */ 
     //Sort the list 
     Collections.sort(people,new MyComparator()); 
    } 
}