【问题标题】:Sorting an ArrayList of Hashmap<String,Object> by int value按 int 值对 Hashmap<String,Object> 的 ArrayList 进行排序
【发布时间】:2013-04-28 21:23:01
【问题描述】:

我搜索了很多,但没有找到适合我的问题的解决方案。现在我想根据 int 值对ArrayList&lt;Hashmap&lt;String, Object&gt;&gt; 进行排序。

HashMap<String, Object>map = new HashMap<String, Object>();
map.put("friend", "x");
map.put("status", "yyoyo");
map.put("time", "20:10");
map.put("lat", 30.030535);
map.put("lng", 31.506050);
map.put("distance", 50); 
statusMapList.add(map);

现在,这是一个示例。 statusMapList 拥有很多这样的 Hashmap,我想根据 distance 的值对它们进行排序,那么有什么办法吗?非常感谢。

【问题讨论】:

    标签: java sorting hashmap


    【解决方案1】:

    如果我正确理解您的用例,您应该更改您的数据表示。

    创建一个实现 Comparable 的名为 Status 的类

    public class Status implements Comparable<Status>
    {
     String friend;
     String status;
     String time; // Or DateTime
     double lat;
     double lng;
     double distance;
    
    // Override compareTo and use distance to decide the order
    // Override equals
    // Override hashcode
    }
    

    现在您应该创建一个ArrayList&lt;Status&gt;(),然后Collections.sort() 应该可以工作了。

    【讨论】:

    • +1 建议创建一个类。 (就个人而言,我更喜欢double 而不是Double。)
    • @srikfreak 你能告诉我这样工作有什么问题吗:public class PositionComparator implements Comparator&lt;HashMap&lt;String, Object&gt;&gt; { @Override public int compare(HashMap&lt;String, Object&gt; o1, HashMap&lt;String, Object&gt; o2) { return ((Double)(o1.get("distanceFromMe"))).compareTo((Double)(o2.get("distanceFromMe"))); } }
    • @Code-Guru - 是的,我同意。在不了解用例的情况下,我应该使用原始类型。已更新。
    • @OmArHesham 使用 HashMap 本身并没有。但是,面向对象编程提供了其他选项,可以使您的代码更加灵活。在这种情况下,创建一个类可以让您轻松地对列表进行排序。
    • @OmArHesham - 您使用 HashMap 的方式“有效”,但不是很优雅。这很难理解,而且不灵活。了解了 Status 的结构后,就应该把它变成一个对象,并使用 OOP 对其进行建模。从长远来看,您将从中受益。
    【解决方案2】:

    只需写你自己的Comparator&lt;HashMap&lt;String, Object&gt;&gt; 并使用this versionCollections.sort()

    【讨论】:

    • 抱歉,我在处理比较器时遇到了很大的问题。你能帮我一个忙,给我一个例子来说明这对我有用吗?非常感谢
    • 其他两个答案在 OOP 方式中可能会更好,所以如果您可以使用对象来表示数据,请这样做。但是,如果这是您无法控制的作业,您可以在比较器类的 compareTo 中返回 map1.get("distance") - map2.get("distance")。
    • 那么下面的解决方案呢:public class PositionComparator implements Comparator&lt;HashMap&lt;String, Object&gt;&gt; { @Override public int compare(HashMap&lt;String, Object&gt; o1, HashMap&lt;String, Object&gt; o2) { return ((Double)(o1.get("distanceFromMe"))).compareTo((Double)(o2.get("distanceFromMe"))); } }
    • @OmArHesham 这看起来一般。对你起作用吗?如果是,你为什么要问?如果不是,有什么问题?另外,我认为您使用"distance" 而不是"distanceFromMe"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2012-04-30
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多