Доступ к последней записи на карте

Как переместить конкретную запись HashMap в последнюю позицию?

Например, у меня есть значения HashMap, такие как:

HashMap<String,Integer> map = new HashMap<String,Integer>();

map= {Not-Specified 1, test 2, testtest 3};

«Not-Specified» может входить в любой должность. это может прийти первым или в середине карты. Но я хочу переместить «Не указано» в последнюю позицию.

Как я могу это сделать? заранее спасибо.

52
задан Sean Patrick Floyd 16 September 2010 в 17:32
поделиться

3 ответа

Чтобы ответить на ваш вопрос одним предложением:

По умолчанию у Карт нет последней записи, это не часть их контракта.


И примечание: рекомендуется кодировать с интерфейсами, а не с классами реализации (см. Эффективная Java, Джошуа Блох , Глава 8, Правило 52: Обращайтесь к объектам по их интерфейсам ).

Итак, ваше объявление должно выглядеть так:

Map<String,Integer> map = new HashMap<String,Integer>();

(Все карты имеют общий контракт, поэтому клиенту не нужно знать, что это за карта, если только он не укажет вспомогательный интерфейс с расширенным контрактом).


Возможные решения

Сортированные карты:

Существует вспомогательный интерфейс SortedMap , который расширяет интерфейс карты с помощью методов поиска на основе порядка и имеет вспомогательный интерфейс NavigableMap это расширяет его еще дальше. Стандартная реализация этого интерфейса TreeMap позволяет вам сортировать записи либо по естественному порядку (если они реализуют интерфейс Comparable ), либо с помощью прилагаемого Comparator .

Вы можете получить доступ к последней записи с помощью метода lastEntry :

NavigableMap<String,Integer> map = new TreeMap<String, Integer>();
// add some entries
Entry<String, Integer> lastEntry = map.lastEntry();

Связанные карты:

Существует также особый случай LinkedHashMap , реализация HashMap, в которой хранятся порядок, в котором вставляются ключи. Однако нет ни интерфейса для резервного копирования этой функции, ни прямого доступа к последнему ключу. Вы можете сделать это только с помощью уловок, таких как использование списка между ними:

Map<String,String> map = new LinkedHashMap<String, Integer>();
// add some entries
List<Entry<String,Integer>> entryList =
    new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Entry<String, Integer> lastEntry =
    entryList.get(entryList.size()-1);

Правильное решение:

Поскольку вы не контролируете порядок вставки, вам следует использовать интерфейс NavigableMap, т.е.вы должны написать компаратор, который помещает запись Not-Specified последней.

Вот пример:

final NavigableMap<String,Integer> map = 
        new TreeMap<String, Integer>(new Comparator<String>() {
    public int compare(final String o1, final String o2) {
        int result;
        if("Not-Specified".equals(o1)) {
            result=1;
        } else if("Not-Specified".equals(o2)) {
            result=-1;
        } else {
            result =o1.compareTo(o2);
        }
        return result;
    }

});
map.put("test", Integer.valueOf(2));
map.put("Not-Specified", Integer.valueOf(1));
map.put("testtest", Integer.valueOf(3));
final Entry<String, Integer> lastEntry = map.lastEntry();
System.out.println("Last key: "+lastEntry.getKey()
         + ", last value: "+lastEntry.getValue());

Вывод:

Последний ключ: Не указан, последнее значение: 1

Решение с использованием HashMap:

Если вы должны полагаться на HashMaps, решение все еще существует, с использованием a) модифицированной версии вышеуказанного компаратора, b) списка List , инициализированного с помощью Map's entrySet и c) вспомогательного метода Collections.sort () :

    final Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("test", Integer.valueOf(2));
    map.put("Not-Specified", Integer.valueOf(1));
    map.put("testtest", Integer.valueOf(3));

    final List<Entry<String, Integer>> entries =
        new ArrayList<Entry<String, Integer>>(map.entrySet());
    Collections.sort(entries, new Comparator<Entry<String, Integer>>(){

        public int compareKeys(final String o1, final String o2){
            int result;
            if("Not-Specified".equals(o1)){
                result = 1;
            } else if("Not-Specified".equals(o2)){
                result = -1;
            } else{
                result = o1.compareTo(o2);
            }
            return result;
        }

        @Override
        public int compare(final Entry<String, Integer> o1,
            final Entry<String, Integer> o2){
            return this.compareKeys(o1.getKey(), o2.getKey());
        }

    });

    final Entry<String, Integer> lastEntry =
        entries.get(entries.size() - 1);
    System.out.println("Last key: " + lastEntry.getKey() + ", last value: "
        + lastEntry.getValue());

}

Вывод:

Последний ключ: Не указан, последнее значение: 1

148
ответ дан 7 November 2019 в 09:01
поделиться

HashMap не имеет «последняя позиция» , так как она не отсортирована.

Вы можете использовать другую Map , которая реализует java.util.SortedMap , наиболее популярным является TreeMap .

17
ответ дан 7 November 2019 в 09:01
поделиться

move не имеет смысла для хэш-карты, поскольку это словарь с хэш-кодом для группирования на основе ключа, а затем связанный список для конфликтующих хэш-кодов, разрешенных с помощью равенства. Используйте TreeMap для отсортированных карт, а затем передайте пользовательский компаратор.

1
ответ дан 7 November 2019 в 09:01
поделиться
Другие вопросы по тегам:

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