如何按键字符串对哈希图进行排序?



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

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

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

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

很抱歉,我没有代码要呈现。

此致敬意

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

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

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

  • HashMap中的所有数据取出到列表(或数组)中并对其进行排序。
  • 使用SortedMap,通常是托马斯·弗里奇在评论中建议的TreeMap
  • 我能得到的最接近的:使用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

如果你必须使用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);

在列表中使用排序键或矢量排序按需映射数据但我确实建议您使用链接列表或二叉树

最新更新