Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按键字符串对Hashmap排序?_Java_String_Sorting_Date_Hashmap - Fatal编程技术网

Java 如何按键字符串对Hashmap排序?

Java 如何按键字符串对Hashmap排序?,java,string,sorting,date,hashmap,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中使用了一些假日日期

    this.holidayMap.put("01.05", new Event("1. Mai"));
    this.holidayMap.put("14.02", new Event("Valentinseday"));
这是我的一些意见。我有一个单独的方法来添加它们。现在我想按字符串日期对它们进行排序,但我不知道如何进行排序。我看过很多简单字符串的帖子,但是由于日期格式的原因,我的帖子有点难

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

    this.holidayMap.put("01.05", new Event("1. Mai"));
    this.holidayMap.put("14.02", new Event("Valentinseday"));
很抱歉,我没有代码要显示

致意 迈克尔


如果你必须使用HashMap,你可以把你的键放在一个浮动列表或向量中,对你的键进行排序并保留你的HashMap


java.util.HashMap holidayMap=new java.util.HashMap();
holidayMap.put(“01.05”,新事件(“1.Mai”);
holidayMap.put(“14.02”,新活动(“情人节”);
java.util.Vector v=new java.util.Vector();
//使用迭代器循环HashMap并将其添加到向量
迭代器it=holidayMap.entrySet().Iterator();
while(it.hasNext()){
Map.Entry对=(Map.Entry)it.next();
v、 add(Integer.valueOf((String)pair.getKey());
}
//现在你要做的就是把钥匙分类
BubbleSort s=新的BubbleSort(v);
使用列表中的已排序键或矢量按需获取已排序地图数据
但是我确实建议您使用LinkedList或二叉树。这有两个问题。我可以解决其中一个问题,但另一个问题不能完全满足您的要求

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

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

  • HashMap
    中的所有数据取出到一个列表(或数组)中,并对其进行排序
  • 使用一个
    SortedMap
    ,通常是托马斯·弗里奇在评论中建议的
    TreeMap
  • 我能得到的最接近的方法是:使用
    LinkedHashMap
    。您可以将顺序控制为插入顺序或访问顺序。要对映射进行排序,您需要对键进行排序,然后依次为每个键删除并重新插入,或者只查询其映射值。
    LinkedHashMap
    HashMap
    的子类,因此它没有尽管这可能会满足你的要求,但在我耳中听起来有点荒谬
为了说明这一点,请注意它与您的要求相冲突,这里有一种方法可以使用streams将您的
HashMap
转换为
TreeMap

    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>()));
它们分类得很好:

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进行排序-它们是无序的(或者更确切地说,没有指定顺序,并且可以更改)。您是否在寻找一个方法的实现,该方法的行是
List getEventsOrderedByDate(Map events)
?你不能对
HashMap
进行排序。你应该使用配备专门的
比较器的。处理日期和排序映射在堆栈溢出时已被多次处理。在发布之前,请始终彻底搜索。我喜欢这个主意。不过,我不会使用
float
s。我相信字符串是日期(没有年份,因为每年都有相同的假日),所以
01.05
表示5月1日,
14.02
表示2月14日。人们可能更喜欢
ArrayList
和它自己的
sort
方法(或
Collections.sort()
)。我确实忽略了日期问题,你的解决方案比我的更有意义。
01.01 New Year
14.02 Valentinesday
17.03 St. Patrick
01.05 1. Mai
17.05 Grunnlovsdag
03.10 Tag der deutschen Einheit