#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. Обратите внимание на столбец порядка итераций.