【问题标题】:How to sort dates in Map<String, String> in java with other value [duplicate]java - 如何使用其他值对Java中的Map <String,String>中的日期进行排序[重复]
【发布时间】:2012-08-24 22:16:06
【问题描述】:

可能重复:
How to sort a Map<Key, Value> on the values in Java?

我在 java 中有一张带有Map&lt;String, String&gt;.Map contaions &lt;Id, Date&gt; 的地图。我想根据日期对这些地图进行排序。我怎样才能做到这一点?这是打印后的地图

-------------------------------------
PTRRRRRR     08-20-2011
-------------------------------------
TESTDESC     08-01-2012
-------------------------------------
TESTMYO      12-29-2011
-------------------------------------
TESTTEST     08-01-2012
-------------------------------------
TESTPROL     08-01-2012
-------------------------------------
TESTPRO      08-01-2012
-------------------------------------
PNAMELQ      08-02-2012
-------------------------------------
TESTMYO      12-29-2011
------------------------------------

【问题讨论】:

  • TESTPRO 出现多次,但键必须是唯一的??
  • 它们实际上是Date 对象还是字符串?这种格式的日期字符串不会按照您想要的方式轻松排序。
  • @Sajith 看来日期是值,而不是键,所以你的链接不适用。
  • 如果你想按值排序,那么这会很有帮助:stackoverflow.com/questions/109383/…

标签: java map


【解决方案1】:

首先检查 http://docs.oracle.com/javase/6/docs/api/java/util/Map.html 并注意,有不同的 Map 实现:

地图的顺序定义为地图集合视图上的迭代器返回其元素的顺序。一些地图实现,如 TreeMap 类,对它们的顺序做出特定的保证;其他的,比如 HashMap 类,不这样做。

http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html 你会发现这个定义:

地图根据其的自然顺序或在地图创建时提供的比较器进行排序,具体取决于使用的构造函数。

由于要按值比较(Map&lt;String, Date&gt;),因此需要实现一个按值比较的Comparator(这是未经测试的):

class ValueComparator implements Comparator<String> {

    Map<String, Date> map;
    public ValueComparator(Map<String, Date> map) {
        this.map = map;
    }

    public int compare(String a, String b) {
        return map.get(a).compareTo(map.get(b));
    }
}

(您可能希望构建更通用的 ValueComparator。)

最后用

构建地图
Map<String, Date> sorted = new TreeMap<String, Date>(new ValueComparator(unsortedMap));
sorted.putAll(unsortedMap);

【讨论】:

    【解决方案2】:

    您可以像这样使用自定义比较器。

    String data = "PTRRRRRR     08-20-2011\n" +
            "TESTDESC     08-01-2012\n" +
            "TESTMYO      12-29-2011\n" +
            "TESTTEST     08-01-2012\n" +
            "TESTPROL     08-01-2012\n" +
            "TESTPRO      08-01-2012\n" +
            "TESTPRO      08-01-2012\n" +
            "PNAMELQ      08-02-2012\n" +
            "TESTMYO      12-29-2011\n";
    Map<String, String> map = new LinkedHashMap<String, String>();
    for (String line : data.split("\n")) {
        String[] keyValue = line.split(" +");
        map.put(keyValue[0], keyValue[1]);
    }
    Map.Entry<String, String>[] entries = map.entrySet().toArray(new Map.Entry[map.size()]);
    Arrays.sort(entries, new Comparator<Map.Entry<String, String>>() {
        SimpleDateFormat date = new SimpleDateFormat("MM-dd-yyyy");
    
        @Override
        public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
            try {
                return date.parse(o1.getValue()).compareTo(date.parse(o2.getValue());
            } catch (ParseException e) {
                throw new AssertionError(e);
            }
        }
    });
    for (Map.Entry entry : entries) {
        System.out.println(entry);
    }
    

    打印

    PTRRRRRR=08-20-2011
    TESTMYO=12-29-2011
    TESTDESC=08-01-2012
    TESTTEST=08-01-2012
    TESTPROL=08-01-2012
    TESTPRO=08-01-2012
    PNAMELQ=08-02-2012
    

    【讨论】:

    • 在 Map#entrySet 上使用 Collections#sort 比将数据复制到数组并使用 Arrays#sort 更快。
    • 好答案。不过真的让人欣赏map.OrderBy(x =&gt; DateTime.Parse(x.Value))的美!
    • 我们将不得不等待 Java 8。但它会来的......
    • @coding.mof 它会更快,除非你不能这样做。 ;) Collections.sort 需要一个列表。
    • 好点。 ;) 从来没有意识到这一点。
    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多