6

Java-класс, реализующий Map и сохраняющий порядок вставки?

15

Я ищу класс на Java, который будет использовать ассоциацию "ключ-значение", но без использования хэш-таблиц. Вот что я сейчас делаю:

  1. Добавляю значения в Hashtable.
  2. Получаю итератор для Hashtable.entrySet().
  3. Прохожу по всем значениям и:
    1. Получаю Map.Entry для итератора.
    2. Создаю объект типа Module (это собственный класс) на основе значения.
    3. Добавляю класс в JPanel.
  4. Отображаю панель.

Проблема в том, что я не контролирую порядок, в котором получаю значения, и не могу отображать их в заданном порядке (без жесткого кодирования порядка).

Я мог бы использовать ArrayList или Vector для этой задачи, но позже в коде мне нужно получить объект Module по данному ключу, что нельзя сделать с помощью ArrayList или Vector.

Есть ли у кого-то информация о свободном или открытом классе Java, который бы это выполнял, или способ извлечения значений из Hashtable в порядке добавления?

Спасибо!

3 ответ(ов)

0

LinkedHashMap будет возвращать элементы в порядке их вставки в карту при итерации через keySet(), entrySet() или values().

Рассмотрим следующий пример кода:

Map<String, String> map = new LinkedHashMap<String, String>();

map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

Этот код выведет элементы в том порядке, в котором они были добавлены в карту:

id = 1
name = rohan 
age = 26 

Таким образом, LinkedHashMap сохраняет порядок вставки элементов, что может быть очень удобно в случае, если вам нужен предсказуемый порядок обхода.

0

Вы можете использовать Map (для быстрой выборки) и List (для сохранения порядка), но самым простым вариантом может быть LinkedHashMap. Вы также можете рассмотреть использование SortedMap, например, TreeMap, который позволяет задать любой порядок, который вам нужен.

0

LinkedHashMap используется для сохранения порядка вставки. Класс LinkedHashMap из коллекций является реализацией интерфейса Map с использованием Hashtable и LinkedList. Он хранит свои записи в Hashtable и использует двусвязный список для поддержания порядка вставки.

Рассмотрим пример на Java для поиска первого неповторяющегося символа. В следующем примере первым неповторяющимся символом является 't'.

Пример кода 1:

String str = "Stress";
Character ch = str.toLowerCase().chars()
    .mapToObj(c -> Character.valueOf((char) c))
    .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))
    .entrySet()
    .stream()
    .filter(entry -> entry.getValue() == 1)
    .map(entry -> entry.getKey())
    .findFirst()
    .get();

Пример кода 2:

String str = "Stress";
Character ch = str.toLowerCase().chars()
    .mapToObj(c -> Character.valueOf((char) c))
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
    .entrySet()
    .stream()
    .filter(entry -> entry.getValue() == 1)
    .map(entry -> entry.getKey())
    .findFirst()
    .get();

В первом примере кода я использовал LinkedHashMap, который сохраняет порядок вставки, поэтому мы получаем ожидаемый результат. Во втором примере мы не сохраняем никакого порядка вставки, в связи с чем результат оказывается неверным.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь