我在HashMap中使用了一些假日日期。
this.holidayMap.put("01.05", new Event("1. Mai"));
this.holidayMap.put("14.02", new Event("Valentinseday"));
这是我的一些意见。我有一个单独的方法来添加它们。现在我想按字符串 - 日期对它们进行排序,但我不知道如何做到这一点。我看过许多简单的字符串帖子,但由于日期格式,地雷有点困难。
我只想调用一个方法,然后对HashMap进行排序。 我不想在其他类型中更改HashMap。因为我必须使用HashMap。
对不起,我没有代码可以呈现。
最诚挚的问候 迈克尔
答案 0 :(得分:4)
这有两个问题。我可以解决一个,但不能完全按照你的要求解决。
简单的方法是如何将字符串排序为日期值。解决方案是使用内置的MonthDay
类。这具有从1月1日到12月31日的自然顺序。可以直接将字符串解析为MonthDay
个对象。
我不能做的部分是排序HashMap
。您无法控制HashMap
中条目的顺序。建议包括:
HashMap
中的所有数据导出到列表(或数组)中并对其进行排序。SortedMap
,通常为TreeMap
,正如Thomas Fritsch在评论中所建议的那样LinkedHashMap
。您可以将订单控制为广告订单或访问顺序。要对地图进行排序,您需要对键进行排序,然后依次为每个键删除它并重新插入,或者仅查询其映射值。 LinkedHashMap
是HashMap
的子类,因此它算作一个。虽然这可能会给你你所要求的东西,但听起来有点荒谬。只是为了说明并意识到它与您提出的问题相冲突,以下是使用信息流将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