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

В CentOS 7 просто остановка и запуск службы MySQL исправили это для меня.

sudo service mysql stop

sudo service mysql start

419
задан Vasily Kabunov 3 November 2016 в 20:25
поделиться

6 ответов

Я предлагаю a LinkedHashMap или a TreeMap. A LinkedHashMap сохраняет ключи в порядке, они были вставлены, в то время как a TreeMap сохранен отсортированным через a Comparator или естественное Comparable упорядочивание элементов.

Так как это не должно сохранять элементы отсортированными, LinkedHashMap должно быть быстрее для большинства случаев; TreeMap имеет O(log n) производительность для containsKey, get, put, и remove, по словам Javadoc, в то время как LinkedHashMap O(1) для каждого.

Если Ваш API, который только ожидает предсказуемый порядок сортировки, в противоположность определенному порядку сортировки, рассматривает использование интерфейсов эти два класса реализация, NavigableMap или SortedMap. Это позволит Вам не пропускать определенные реализации в свой API и переключаться или на тех определенных классов или на совершенно другой реализации по желанию впоследствии.

690
ответ дан 22 November 2019 в 23:14
поделиться

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

6
ответ дан 22 November 2019 в 23:14
поделиться

Я не знаю, является ли это открытый исходный код, но после небольшого поиска с помощью Google, я нашел эту реализацию использования Карты ArrayList. Это, кажется, пред1.5 Java, таким образом, Вы могли бы хотеть к genericize это, который должен быть легким. Обратите внимание, что эта реализация имеет O (N) доступ, но это не должно быть проблемой, если Вы не добавляете сотни виджетов к своему JPanel, который Вы не были должны так или иначе.

1
ответ дан 22 November 2019 в 23:14
поделиться

Или можно использовать LinkedHashMap<K, V> , или можно реализовать Вас собственный CustomMap, который поддерживает порядок вставки.

можно использовать Следующий CustomHashMap со следующими функциями:

  • порядок Вставки поддержан, при помощи LinkedHashMap внутренне.
  • Ключи с null или пустые строки не позволяются.
  • , Как только ключ со значением создается, мы не переопределяем его значение.

HashMap по сравнению с LinkedHashMap по сравнению с CustomHashMap

interface CustomMap<K, V> extends Map<K, V> {
    public boolean insertionRule(K key, V value);
}

@SuppressWarnings({ "rawtypes", "unchecked" })
public class CustomHashMap<K, V> implements CustomMap<K, V> {
    private Map<K, V> entryMap;
    // SET: Adds the specified element to this set if it is not already present.
    private Set<K> entrySet;

    public CustomHashMap() {
        super();
        entryMap = new LinkedHashMap<K, V>();
        entrySet = new HashSet();
    }

    @Override
    public boolean insertionRule(K key, V value) {
        // KEY as null and EMPTY String is not allowed.
        if (key == null || (key instanceof String && ((String) key).trim().equals("") ) ) {
            return false;
        }

        // If key already available then, we are not overriding its value.
        if (entrySet.contains(key)) { // Then override its value, but we are not allowing
            return false;
        } else { // Add the entry
            entrySet.add(key);
            entryMap.put(key, value);
            return true;
        }
    }
    public V put(K key, V value) {
        V oldValue = entryMap.get(key);
        insertionRule(key, value);
        return oldValue;
    }
    public void putAll(Map<? extends K, ? extends V> t) {
        for (Iterator i = t.keySet().iterator(); i.hasNext();) {
            K key = (K) i.next();
            insertionRule(key, t.get(key));
        }
    }

    public void clear() {
        entryMap.clear();
        entrySet.clear();
    }
    public boolean containsKey(Object key) {
        return entryMap.containsKey(key);
    }
    public boolean containsValue(Object value) {
        return entryMap.containsValue(value);
    }
    public Set entrySet() {
        return entryMap.entrySet();
    }
    public boolean equals(Object o) {
        return entryMap.equals(o);
    }
    public V get(Object key) {
        return entryMap.get(key);
    }
    public int hashCode() {
        return entryMap.hashCode();
    }
    public boolean isEmpty() {
        return entryMap.isEmpty();
    }
    public Set keySet() {
        return entrySet;
    }
    public V remove(Object key) {
        entrySet.remove(key);
        return entryMap.remove(key);
    }
    public int size() {
        return entryMap.size();
    }
    public Collection values() {
        return entryMap.values();
    }
}

Использование [1 110]:

public static void main(String[] args) {
    System.out.println("== LinkedHashMap ==");
    Map<Object, String> map2 = new LinkedHashMap<Object, String>();
    addData(map2);

    System.out.println("== CustomHashMap ==");
    Map<Object, String> map = new CustomHashMap<Object, String>();
    addData(map);
}
public static void addData(Map<Object, String> map) {
    map.put(null, "1");
    map.put("name", "Yash");
    map.put("1", "1 - Str");
    map.put("1", "2 - Str"); // Overriding value
    map.put("", "1"); // Empty String
    map.put(" ", "1"); // Empty String
    map.put(1, "Int");
    map.put(null, "2"); // Null

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

O/P:

== LinkedHashMap == | == CustomHashMap ==
null = 2            | name = Yash
name = Yash         | 1 = 1 - Str
1 = 2 - Str         | 1 = Int
 = 1                |
  = 1               |
1 = Int             |
<час>

, Если Вы знаете, КЛЮЧ починен тогда, можно использовать EnumMap. Доберитесь значения формируют СВОЙСТВА/XML-ФАЙЛЫ

EX:

enum ORACLE {
    IP, URL, USER_NAME, PASSWORD, DB_Name;
}

EnumMap<ORACLE, String> props = new EnumMap<ORACLE, String>(ORACLE.class);
props.put(ORACLE.IP, "127.0.0.1");
props.put(ORACLE.URL, "...");
props.put(ORACLE.USER_NAME, "Scott");
props.put(ORACLE.PASSWORD, "Tiget");
props.put(ORACLE.DB_Name, "MyDB");
0
ответ дан 22 November 2019 в 23:14
поделиться

Вы можете попробовать мою связанную карту дерева .

1
ответ дан 22 November 2019 в 23:14
поделиться

Если неизменяемая карта соответствует вашим потребностям, тогда есть библиотека Google под названием guava (см. также вопросы по гуаве)

Гуава предоставляет ImmutableMap с надежным заданным пользователем порядком итерации. Этот ImmutableMap имеет производительность O(1) для containsKey, get. Очевидно, что установка и удаление не поддерживаются.

Объекты ImmutableMap создаются с использованием либо элегантных статических удобных методов of() и copyOf(), либо объекта Builder.

16
ответ дан 22 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: