2010-03-03 96 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