【问题标题】:How to sort a hasmap in java?如何在java中对hashmap进行排序?
【发布时间】:2012-06-18 10:27:28
【问题描述】:

这是我的哈希图:

Map<String,String> unsortMap = new HashMap<String,String>()此映射包含如下值

unsortMap.put("18/06/2012", "18/06/2012");
unsortMap.put("19/06/2012", "19/06/2012");
unsortMap.put("20/06/2012", "20/06/2012");
unsortMap.put("26/06/2012", "26/06/2012");
unsortMap.put("27/06/2012", "27/06/2012");
unsortMap.put("04/07/2012", "04/07/2012");
unsortMap.put("13/07/2012", "13/07/2012");
unsortMap.put("29/06/2012", "29/06/2012");

我用来排序这张地图的代码如下:

package samples;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class SortMapExample{

   public static void main(String[] args) {

    System.out.println("Unsort Map......");
    Map<String,String> unsortMap = new HashMap<String,String>();

    unsortMap.put("18/06/2012", "18/06/2012");
    unsortMap.put("19/06/2012", "19/06/2012");
    unsortMap.put("20/06/2012", "20/06/2012");
    unsortMap.put("26/06/2012", "26/06/2012");
    unsortMap.put("27/06/2012", "27/06/2012");
    unsortMap.put("04/07/2012", "04/07/2012");
    unsortMap.put("13/07/2012", "13/07/2012");
    unsortMap.put("29/06/2012", "29/06/2012");

    Iterator iterator=unsortMap.entrySet().iterator();

        for (Map.Entry entry : unsortMap.entrySet()) {
            System.out.println("Key : " + entry.getKey() 
                + " Value : " + entry.getValue());
        }

        System.out.println("Sorted Map......");
        Map<String,String> sortedMap =  sortByComparator(unsortMap);

        for (Map.Entry entry : sortedMap.entrySet()) {
            System.out.println("Key : " + entry.getKey() 
                + " Value : " + entry.getValue());
        }
   }

   private static Map sortByComparator(Map unsortMap) {

        List list = new LinkedList(unsortMap.entrySet());

        //sort list based on comparator
        Collections.sort(list, new Comparator() {
             public int compare(Object o1, Object o2) {
               return ((Comparable) ((Map.Entry) (o1)).getValue())
               .compareTo(((Map.Entry) (o2)).getValue());
             }
    });

        //put sorted list into map again
    Map sortedMap = new LinkedHashMap();
    for (Iterator it = list.iterator(); it.hasNext();) {
         Map.Entry entry = (Map.Entry)it.next();
         sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
   }    
}

我得到的结果是这样的:

Sorted Map......
Key : 04/07/2012 Value : 04/07/2012
Key : 13/07/2012 Value : 13/07/2012
Key : 18/06/2012 Value : 18/06/2012
Key : 19/06/2012 Value : 19/06/2012
Key : 20/06/2012 Value : 20/06/2012
Key : 26/06/2012 Value : 26/06/2012
Key : 27/06/2012 Value : 27/06/2012
Key : 29/06/2012 Value : 29/06/2012

我希望结果如下所示:(地图也应按月份排序)

18/06/2012
19/06/2012
20/06/2012
26/06/2012
27/06/2012
29/06/2012
04/07/2012
13/07/2012

请帮我解决这个问题?

【问题讨论】:

  • 您不使用 java.util.Date 而不是 String 的任何原因?
  • 这可能不是你想听到的,但我无法抗拒:如果你按字符串排序,你应该使用ISO 8601,little endian 非常糟糕。

标签: java map


【解决方案1】:

parse() StringDate 然后比较两个日期实例而不是 String

查看this exampleString 转换为Date,现在一旦你有了日期实例,它就已经实现了你可以简单使用的比较器

return dateInstance1.compare(dateInstance2)

在你的比较器中

注意:如果您将这些日期作为字符串从数据库中读取,则 please see this

【讨论】:

  • @Tony 有什么要解释的?解析日期,比较日期。否则编写一个自定义的多字段比较器。
  • 使用您当前的方法,它只是按时间顺序比较字符串,这不是日期的实际比较
  • @JigarJoshi - 你的意思是按字典顺序而不是按时间顺序。他需要更改字符串比较以按时间顺序排列;即按时间顺序。
【解决方案2】:

因为HashMap 是无序的。您应该使用TreeMap 而不是HashMap。您还需要将String 解析为Date 进行比较。

详情:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html

【讨论】:

  • 如上所述,日期存储在数据库中。(字符串)
  • 需要通过TreeMap自定义比较器
  • @JigarJoshi 这也是需要做的。
  • @plucury - 这是真的,但是如果您阅读代码,您会发现 Tony 已经在使用 LinkedHashMap 来表示排序后的 Map。
【解决方案3】:

您正在对字符串进行排序,字符串的默认行为是按 ASCII 顺序排序。

如果您想以其他方式对键进行排序,则需要将它们转换为您真正想要的类型(在本例中为日期)

使用 SimpleDateFormat 将键转换为 Date 对象并进行比较。

【讨论】:

    【解决方案4】:

    将您的数据转换为 SortedMap,特别是 TreeMap 实例。

    使用带有 Comparator 的构造函数,并在其中执行比较逻辑。

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2017-09-22
      • 1970-01-01
      • 2015-11-12
      • 2014-11-12
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多