【问题标题】:How to sort a Hashmap by key String?如何通过键字符串对 Hashmap 进行排序?
【发布时间】:2017-11-12 16:33:00
【问题描述】:

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

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

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

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

很抱歉,我没有要显示的代码。

最好的问候 迈克尔

【问题讨论】:

  • 您不对哈希图进行排序 - 它们是无序的(或者更确切地说,未指定排序,并且可以更改)。
  • 您是否正在寻找类似List<Event> getEventsOrderedByDate(Map<String, Event> events) 的方法的实现?
  • 您无法对HashMap 进行排序。您应该使用配备专用ComparatorTreeMap
  • Stack Overflow 上已多次解决处理日期和排序图。发帖前一定要彻底搜索。

标签: java string sorting date hashmap


【解决方案1】:

如果您必须使用 HashMap,您可以将您的键放在浮点列表或向量中,并对您的键进行排序并保留您的 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 或二叉树

【讨论】:

  • 我喜欢这个想法。不过,我不会使用floats。我相信字符串是日期(没有年份,因为每年都会发生相同的假期),所以01.05 表示 5 月 1 日,14.02 表示 2 月 14 日。人们也可能更喜欢ArrayList 和它自己的sort 方法(或@ 987654327@).
  • 我确实忽略了日期问题,您的解决方案比我的更有意义。
【解决方案2】:

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

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

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

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

只是为了说明并意识到它与您的要求相冲突,这是一种使用流将您的 HashMap&lt;String, Event&gt; 转换为 TreeMap&lt;MonthDay, Evenet&gt; 的方法:

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多