Подтвердить что ты не робот

Как добавить элемент в определенный индекс/позицию в LinkedHashMap?

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

Даже если бы я мог добавить элемент в FIRST или LAST, ссылка в LinkedHashMap поможет!

4b9b3361

Ответ 1

Вы не можете изменить порядок. Это insert-order (по умолчанию) или access-order с помощью этого конструктора:

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

  • Создает пустой экземпляр LinkedHashMap с указанной начальной мощностью, коэффициентом загрузки и режимом заказа.

  • Параметры:     initialCapacity - начальная емкость     loadFactor - коэффициент нагрузки     accessOrder - режим упорядочения - true для порядка доступа, false для ввода-заказа

  • Броски:     IllegalArgumentException - если начальная емкость отрицательная или коэффициент загрузки неположителен

Смотрите: LinkedHashMap

Ответ 2

Вы можете добавить этот элемент в 1. или последнее место:

Добавление в последнее место ► Вам просто нужно удалить предыдущую запись с карты следующим образом:

map.remove(key);
map.put(key,value);

Добавление на первое место ► Это немного сложнее, вам нужно клонировать карту, очищать ее, поместить на нее значение 1. и поместить в нее новую карту, например:

Я использую карты со строковыми клавишами и значениями Group (мой пользовательский класс):

LinkedHashMap<String, Group> newmap=(LinkedHashMap<String, Group>) map.clone();
map.clear();
map.put(key, value);
map.putAll(newm);

Как вы видите, с помощью этих методов вы можете добавить неограниченное количество вещей в начало и до конца карты.

Ответ 3

Просто разделите LinkedHashMap на 2 массива. Сделайте первый массив с размером index - 1 и положите в конец новый Entry. Затем заполните первый массив элементами из второго

Ответ 4

public static <K, V> void add(LinkedHashMap<K, V> map, int index, K key, V value) {
  assert (map != null);
  assert !map.containsKey(key);
  assert (index >= 0) && (index < map.size());

  int i = 0;
  List<Entry<K, V>> rest = new ArrayList<Entry<K, V>>();
  for (Entry<K, V> entry : map.entrySet()) {
    if (i++ >= index) {
      rest.add(entry);
    }
  }
  map.put(key, value);
  for (int j = 0; j < rest.size(); j++) {
    Entry<K, V> entry = rest.get(j);
    map.remove(entry.getKey());
    map.put(entry.getKey(), entry.getValue());
  }
}

Ответ 5

Это a Map, у него нет индексов. У этого есть ведра. Как это работает, когда вы делаете

put(key, val)

Он хэширует ключ, чтобы узнать, какое ведро для ввода значения.

LinkedHashMap поддерживает двусвязный список, поэтому он может записывать порядок, в который вставлены записи (или доступ, в зависимости от того, как вы создаете экземпляр карты). API API на карте не существует, чтобы вставить ключ, пару val в определенном индексе связанного списка, потому что это не та цель, которой она служит.

Ответ 6

Решение Apache Commons: ListOrderedMap

Так как JDK LinkedHashMap обеспечивает только поиск порядка вставки, в случае, если вы хотите вставить в индекс, мы можем использовать альтернативный вариант Apache Commons ListOrderedMap. Он делает это так, как кажется - имея список для поддержания порядка вставки с соответствующим индексом и обычной картой для вставки, как мы обычно делаем. Вот что docs говорит:

public class ListOrderedMap<K,V>
extends AbstractMapDecorator<K,V>
implements OrderedMap<K,V>, Serializable

Украшает Map, чтобы сохранить порядок добавления используя список для поддержания порядка.

Порядок будет использоваться через итераторы и методы toArray на Просмотры. Заказ также возвращается MapIterator. orderedMapIterator() обращается к итератору, который может выполнять итерацию как вперед, так и назад через карту. К тому же, для доступа к карте по индексу предоставляются методы без интерфейса.

Если объект добавляется к Карте во второй раз, он останется в исходное положение на итерации.

Обратите внимание, что ListOrderedMap не синхронизируется и не является потокобезопасным. Если вы хотите использовать эту карту из нескольких потоков одновременно, вы должен использовать соответствующую синхронизацию. Самый простой способ - обернуть эту карту, используя Collections.synchronizedMap(Map). Этот класс может исключений при доступе к одновременным потокам без синхронизации.

Обратите внимание, что ListOrderedMap не работает с IdentityHashMap, CaseInsensitiveMap или аналогичные карты, которые нарушают общий договор Map. ListOrderedMap (или, точнее, лежащий в основе List) полагается на equals(). Это прекрасно, пока украшенный Map также основан на equals() и hashCode(), которые IdentityHashMap, и CaseInsensitiveMap не: Первый использует ==, а последний использует equals() для ключа с нижним окошком.

Вот его реализация для добавления в позицию:

        /**
428     * Puts a key-value mapping into the map at the specified index.
429     * <p>
430     * If the map already contains the key, then the original mapping
431     * is removed and the new mapping added at the specified index.
432     * The remove may change the effect of the index. The index is
433     * always calculated relative to the original state of the map.
434     * <p>
435     * Thus the steps are: (1) remove the existing key-value mapping,
436     * then (2) insert the new key-value mapping at the position it
437     * would have been inserted had the remove not occurred.
438     *
439     * @param index  the index at which the mapping should be inserted
440     * @param key  the key
441     * @param value  the value
442     * @return the value previously mapped to the key
443     * @throws IndexOutOfBoundsException if the index is out of range [0, size]
444     * @since 3.2
445     */
446    public V put(int index, final K key, final V value) {
447        if (index < 0 || index > insertOrder.size()) {
448            throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + insertOrder.size());
449        }
450
451        final Map<K, V> m = decorated();
452        if (m.containsKey(key)) {
453            final V result = m.remove(key);
454            final int pos = insertOrder.indexOf(key);
455            insertOrder.remove(pos);
456            if (pos < index) {
457                index--;
458            }
459            insertOrder.add(index, key);
460            m.put(key, value);
461            return result;
462        }
463        insertOrder.add(index, key);
464        m.put(key, value);
465        return null;
466    }