如何按密钥字符串对Hashmap进行排序?

时间:2017-06-10 21:54:16

标签: java string sorting date hashmap

我在HashMap中使用了一些假日日期。

    this.holidayMap.put("01.05", new Event("1. Mai"));
    this.holidayMap.put("14.02", new Event("Valentinseday"));

这是我的一些意见。我有一个单独的方法来添加它们。现在我想按字符串 - 日期对它们进行排序,但我不知道如何做到这一点。我看过许多简单的字符串帖子,但由于日期格式,地雷有点困难。

我只想调用一个方法,然后对HashMap进行排序。 我不想在其他类型中更改HashMap。因为我必须使用HashMap。

对不起,我没有代码可以呈现。

最诚挚的问候 迈克尔

2 个答案:

答案 0 :(得分:4)

这有两个问题。我可以解决一个,但不能完全按照你的要求解决。

简单的方法是如何将字符串排序为日期值。解决方案是使用内置的MonthDay类。这具有从1月1日到12月31日的自然顺序。可以直接将字符串解析为MonthDay个对象。

我不能做的部分是排序HashMap。您无法控制HashMap中条目的顺序。建议包括:

  • HashMap中的所有数据导出到列表(或数组)中并对其进行排序。
  • 使用SortedMap,通常为TreeMap,正如Thomas Fritsch在评论中所建议的那样
  • 我能得到的最近:使用LinkedHashMap。您可以将订单控制为广告订单或访问顺序。要对地图进行排序,您需要对键进行排序,然后依次为每个键删除它并重新插入,或者仅查询其映射值。 LinkedHashMapHashMap的子类,因此它算作一个。虽然这可能会给你你所要求的东西,但听起来有点荒谬。

只是为了说明并意识到它与您提出的问题相冲突,以下是使用信息流将HashMap<String, Event>转换为TreeMap<MonthDay, Evenet>的方法:

    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("dd.MM");
    SortedMap<MonthDay, Event> sortedHolidayMap = this.holidayMap
            .entrySet()
            .stream()
            .collect(Collectors.toMap((Map.Entry<String, Event> e) -> MonthDay.parse(e.getKey(), parseFormatter), 
                                      (Map.Entry<String, Event> e) -> e.getValue(),
                                      (u, v) -> { throw new IllegalArgumentException(); },
                                      () -> new TreeMap<MonthDay, Event>()));

对于第一次测试,我尝试将更多假期填入HashMap

    this.holidayMap.put("01.05", new Event("1. Mai"));
    this.holidayMap.put("14.02", new Event("Valentinesday"));
    this.holidayMap.put("03.10", new Event("Tag der deutschen Einheit"));
    this.holidayMap.put("01.01", new Event("New Year"));
    this.holidayMap.put("17.05", new Event("Grunnlovsdag"));
    this.holidayMap.put("17.03", new Event("St. Patrick"));

他们出来排序很好:

01.01 New Year
14.02 Valentinesday
17.03 St. Patrick
01.05 1. Mai
17.05 Grunnlovsdag
03.10 Tag der deutschen Einheit

答案 1 :(得分:0)

如果必须使用HashMap,可以将密钥放在Float列表或向量中,然后对密钥进行排序并保留HashMap。

java.util.HashMap<String, Event> holidayMap = new java.util.HashMap<String, Event>();

holidayMap.put("01.05", new Event("1. Mai"));
holidayMap.put("14.02", new Event("Valentinseday");

java.util.Vector<Float> v = new java.util.Vector<Float>();

// Use an Iterator to loop through the HashMap and add it to the Vector
Iterator it = holidayMap.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();          
    v.add(Integer.valueOf((String) pair.getKey()));

}

// now all you have to do is sort your keys
BubbleSort s = new BubbleSort(v);

使用列表中的排序键或Vector按需获取排序的地图数据 但我建议你使用LinkedList或Binary Tree