Java 为什么我的hashmap没有按时间顺序打印?

Java 为什么我的hashmap没有按时间顺序打印?,java,Java,为什么我的输出不是按时间顺序的,或者它不符合用户输入基于输出我发现它像随机的值条目我怎么能按时间顺序打印地图的值而不使用Treemap排序我只是使用Hashmap和map包所以你认为在这个逻辑错误中发生了什么?仅使用Hashmap如何满足预期输出?可以吗 import java.util.Scanner; import java.util.Map; import java.util.HashMap; public class StudentList

为什么我的输出不是按时间顺序的,或者它不符合用户输入基于输出我发现它像随机的值条目我怎么能按时间顺序打印地图的值而不使用Treemap排序我只是使用Hashmap和map包所以你认为在这个逻辑错误中发生了什么?仅使用Hashmap如何满足预期输出?可以吗

   import java.util.Scanner;
    import java.util.Map;
    import java.util.HashMap;
    
    public class StudentList
    {
        public static void main(String[] args) 
        {
            Scanner sc = new Scanner(System.in);
            Map<String,String> students = new HashMap<>();
    
            for (int x=1; x<=3; x++) 
            {
                System.out.print("Enter student number " + x + ": ");
                String studnum = sc.nextLine();
                System.out.print("Enter first name " + x + ": ");
                String studfname = sc.nextLine();
    
                students.put(studnum, studfname);
                if (x==3) 
                {
                    System.out.println("\nPlease hit ENTER");
                    String enter = sc.nextLine();
                    if (enter.equals("")) {
                        System.out.println("Processing...");
                        students.remove(studnum,studfname);
                        System.out.println("3rd entry removed!\n");
                        System.out.print("Enter student number 3: ");
                        String studnum1 = sc.nextLine();
                        System.out.print("Enter first name 3: ");
                        String studfname1 = sc.nextLine();
                        students.put(studnum1, studfname1);
                }
                else
                {
                    System.out.println("Invalid Please Try again....");
                }
                }
            
            }
            System.out.println("\nStudent List: ");
            for (Map.Entry e : students.entrySet()  ) 
            {
    
                System.out.println(e.getKey() + " : " + e.getValue());
            }
        }
    }
预期产出:

Enter student number 1: 2018-0004
Enter first name 1: Mark
Enter student number 2: 2018-0017
Enter first name 2: Nika
Enter student number 3: 2018-0134
Enter first name 3: Mairo

Please hit ENTER

Processing...
3rd entry removed!

Enter student number 3: 2018-0134
Enter first name 3: Mairo

Student List:
2018-0004 : Mark
2018-0017 : Nika
2018-0134 : Mairo

对于时间顺序,您应该使用LinkedHashMap

这是不同的数据结构。HashMap不记得插入顺序。

它不是HashMap的一部分,但您可以使用java streams执行以下操作来对其进行排序:

map.entrySet().stream().sorted((s1, s2) -> s1.getKey().compareTo(s2.getKey()))
      .forEach(s -> System.out.println(s.getKey() + " : " + s.getValue()));
你问:

为什么我的hashmap没有按时间顺序打印

为什么我的输出不是按时间顺序排列的,或者不是按用户输入的顺序排列的

因为这种排序不是该类的特征。为什么我的微波炉不洗碗

HashMap没有承诺其迭代顺序。如果您关心迭代顺序,请使用不同的实现

引用HashMap Javadoc:

此类不保证地图的顺序;特别是,它不能保证订单在一段时间内保持不变

如果希望地图按其键的自然顺序排序,请使用SortedMap或NavigableMap。TreeMap就是这样一种实现。你莫名其妙地拒绝使用树形图,这对我来说毫无意义。如果你想开车,不要拒绝提供车辆。 如果要按照原始插入顺序对映射进行排序,请使用LinkedHashMap。 下面是我制作的一个图表,显示了与Java捆绑的映射实现的各种属性。注意迭代顺序列


HashMap根本不记得元素的放置顺序。LinkedHashMap怎么样?简短的回答是不,这是不可能的。如何仅使用Hashmap就达到预期的输出?可以吗?@wloleo如果你只使用HasMap。您还可以使用列表来保持键插入顺序。不,仅使用HashMap是不可能的。如果您不相信我们,请阅读javadocs。这是正确的,但我认为没有必要使用排序,也就是说,如果您可以使用特殊的数据结构来进行开箱即用的排序,则会增加复杂性。@oleg.cherednik,这取决于应用程序。对于按键查找对象来说,拥有HashMap的效率可能很重要,但对于很少使用的按顺序列出对象的函数来说,这并不重要。
map.entrySet().stream().sorted((s1, s2) -> s1.getKey().compareTo(s2.getKey()))
      .forEach(s -> System.out.println(s.getKey() + " : " + s.getValue()));