2010-03-03 75 views
2

的名單上有HashMapList如下面如何排序包含HashMap

ArrayList l = new ArrayList(); 
HashMap m = new HashMap(); 
m.add("site_code","AL"); 
m.add("site_name","Apple"); 
l.add(m); 
m = new HashMap(); 
m.add("site_code","JL"); 
m.add("site_name","Cat"); 
l.add(m); 
m = new HashMap(); 
m.add("site_code","PL"); 
m.add("site_name","Banana"); 
l.add(m) 

我想排序基於site_namelist。所以最後它會被排序爲。

Apple, Banana, Cat 

我是想這樣的事情:

Collections.sort(l, new Comparator(){ 
      public int compare(HashMap one, HashMap two) { 
       //what goes here? 
      } 
}); 

回答

8

如果你讓你的收藏品通用的,它會顯得大約是這樣的:

Collections.sort(l, new Comparator<HashMap<String, String>>(){ 
     public int compare(HashMap<String, String> one, HashMap<String, String> two) { 
      return one.get("site_name").compareTo(two.get("site_name")); 
     } 
}); 

如果您不能使用因爲你被困在1.4或更早版本的平臺上,所以你必須將get轉換爲String

(此外,作爲一個風格問題,我寧願聲明變量作爲ListMap而不是ArrayListHashMap但是,這不相關的問題。)

+0

如果我使用這個,那麼我得到一個編譯錯誤,說我沒有實現所有的抽象方法。嘗試在NB中自動修復它,它會添加以下方法以及我已經具有的比較:'public int compare(Object o1,Object o2){throw new UnsupportedOperationException(「Not supported yet。」);}' – drake 2010-03-03 16:37:12

+0

@drake:對不起,我忘了將泛型添加到比較器定義中。它現在應該編譯。 – 2010-03-03 16:43:56

+0

Thx爲您的答案 – vlasevich 2017-01-27 11:58:15

3

喜歡的東西:

String codeOne = (String)one.get("site_code"); 
String codeTwo = (String)two.get("site_code"); 

return codeOne.compareTo(codeTwo); 

我還沒有編譯或測試過,但它應該沿着這些線。

+0

(剛剛被mmyers毆打 - 絕對是他們的基於泛型的答案)。 – 2010-03-03 16:32:26

8

我認爲現在是思考重新設計的好時機。在你的例子中,它看起來像所有的對象都有相同的兩個字段 - site_namesite_code。在那種情況下,爲什麼不定義你自己的班級,而不是使用HashMap

public class Site implements Comparable<Site> { 
    private String site_name; 
    private String site_code; 

    // getters and setters, equals, and hashCode 

    public int compareTo(Site other) { 
     return this.site_name.compareTo(other.getSiteName); 
    } 
} 

然後你可以使用Collections.sort()

+1

+1 - 這是絕對要走的路。 – 2010-03-03 16:44:50