#java #hashtable #enumeration
#java #хеш — таблица #перечисление
Вопрос:
Я создал словарь для вывода ключей хэш-таблицы.
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.Hashtable;
public class Foo {
public static void main (String [] args) {
Dictionary<String, String> dict = new Hashtable<String, String>();
dict.put("Emma", "Watson");
dict.put("Tom", "Hanks");
dict.put("Keanu", "Reeves");
Enumeration<String> emu = dict.keys();
while (emu.hasMoreElements()) {
System.out.println(emu.nextElement());
}
}
}
Выходной сигнал :
Keanu
Emma
Tom
Я хочу, чтобы выходные данные были указаны в исходном порядке, в который я их ввел (Эмма, Том, Киану), но он выводит этот случайный порядок, который даже не алфавитный. Пожалуйста, помогите мне понять, как и почему это происходит, и как устранить проблему
Ответ №1:
Вы должны использовать LinkedHashMap<>
, который сочетает в себе хэш-карту для быстрого доступа, но также сохраняет элементы, упорядоченные по порядку их вставки. Например
Map<String,String> dict = new LinkedHashMap<>();
dict.put("Emma", "Watson");
dict.put("Tom", "Hanks");
dict.put("Keanu", "Reeves");
for (String s : dict.keySet())
System.out.println(s);
Это выведет ключи в том порядке, в котором они были вставлены в карту.
Кстати, Dictionary
, Hashtable
и связанные классы очень старые и заменены Map
и его реализациями.
Ответ №2:
Прочитайте о хэш-коде и равенствах. Хэш-коллекции почти всегда содержат элементы в случайном порядке (возможно, без чего-то вроде LinkedHashSet или LinkedHashMap, которые сохраняют порядок ввода, но это что-то другое). Они быстрее получают элементы из любой позиции. В вашей проблеме, я думаю, вы можете обернуть свои строки в новый класс, например Name, и использовать Comparator или Comparable интерфейсы для их сортировки. Или просто измените словарь на хеш-таблицу и получите entrySet:
public static void main (String [] args) {
Hashtable<String, String> dict = new Hashtable<>();
dict.put("Emma", "Watson");
dict.put("Tom", "Hanks");
dict.put("Keanu", "Reeves");
for (Map.Entry<String, String> s : dict.entrySet()) {
//ordered by entry
System.out.println(s.getKey());
}
}
Ответ №3:
Поместите его в другую хеш-таблицу с помощью Hashtable <Int, String> , где int — порядок, а string — ключ. затем поместите хеш-таблицу в большую хеш-таблицу, чтобы хеш-таблица была <<int, String>, String>
Комментарии:
1. Разве нет гораздо более простого способа его сортировки? Это кажется лишней ненужной работой
2. Это ужасная идея.
LinkedHashMap
это правильный путь, поскольку он сохраняет порядок вставки..3. Не очень круто, вы должны проверить это, прежде чем публиковать его в качестве ответа