Почему моя хэш-карта не печатается в хронологическом порядке?

#java

#java

Вопрос:

почему мой вывод не в хронологическом порядке или он не соответствует пользовательскому вводу базы данных на выходе я нашел это как случайные записи значения Как я могу напечатать значение моей карты в хронологическом порядке без использования Treemap для сортировки я просто использую пакет Hashmap и Map так что делать как вы думаете, происходит ли в этом логическая ошибка? как я могу получить ожидаемый результат, используя только Hashmap? это posibble?

    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-0017 : Nika
2018-0004 : Mark
2018-0134 : Mairo
 

Ожидаемый результат:

 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
 

Комментарии:

1. HashMap просто не запоминает порядок, в котором вы размещаете элементы. Как насчет а LinkedHashMap ?

2. Короткий ответ: нет, это невозможно.

Ответ №1:

Для хронологического порядка вы должны использовать LinkedHashMap .

Это разные структуры данных. HashMap не запоминает порядок вставки.

Комментарии:

1. как я могу получить ожидаемый результат, используя только Hashmap? это posibble?

2. @wloleo o, если вы используете только HasMap . Вы можете дополнительно использовать List для сохранения порядка вставки ключей.

3. Нет, это невозможно с помощью just HashMap . Если вы нам не верите, почитайте javadocs.

Ответ №2:

Это не часть HashMap , но вы можете сделать что-то вроде следующего с потоками java, чтобы отсортировать его:

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

Комментарии:

1. Это правильно, но я думаю, что нет необходимости использовать сортировку (т. Е. Дополнительную сложность), если вы можете использовать специальную структуру данных, которая дает вам сортировку «из коробки».

2. @oleg.cherednik, это зависит от приложения. Возможно, было бы важно иметь эффективность a HashMap для поиска объектов по ключу, но не так важно для редко используемой функции перечисления объектов по порядку.

Ответ №3:

Вы спросили:

Почему моя хэш-карта не печатается в хронологическом порядке?

почему мой вывод не в хронологическом порядке или не соответствует вводу пользователя

Потому что такой порядок не является особенностью этого класса. Почему моя микроволновая печь не моет посуду?

HashMap не дает никаких обещаний относительно порядка итераций. Если вы заботитесь о порядке итераций, используйте другую реализацию Map .

Чтобы процитировать HashMap Javadoc:

Этот класс не дает никаких гарантий относительно порядка отображения; в частности, он не гарантирует, что порядок будет оставаться постоянным с течением времени.

  • Если вы хотите, чтобы карта упорядочивалась по естественному порядку ее ключей, используйте SortedMap или NavigableMap . TreeMap это одна из таких реализаций. Вы по необъяснимым причинам отказались использовать TreeMap то, что не имеет для меня никакого смысла. Если вы хотите водить, не отказывайтесь от предложения транспортного средства.
  • Если вы хотите, чтобы карта была упорядочена по исходному порядку вставки, используйте LinkedHashMap .

Вот диаграмма таблицы, которую я сделал, показывая различные атрибуты Map реализаций, связанных с Java. Обратите внимание на столбец порядка итераций.

введите описание изображения здесь