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

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

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

Например, у меня есть значения HashMap следующим образом:

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

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

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

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

4b9b3361

Ответ 1

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

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


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

Итак, ваша декларация должна выглядеть следующим образом:

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

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


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

Отсортированные карты:

Существует дополнительный интерфейс SortedMap, который расширяет интерфейс карты с помощью методов поиска на основе заказа и имеет дополнительный интерфейс NavigableMap, что еще больше расширяет его. Стандартная реализация этого интерфейса TreeMap позволяет сортировать записи либо путем естественного упорядочения (если они реализуют Сопоставимый интерфейс) или с помощью поставляемого 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, все еще существует решение, использующее: а) модифицированную версию вышеприведенного компаратора, b) a List инициализируется с помощью карты 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

Ответ 2

HashMap не имеет "последней позиции", поскольку он не сортируется.

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

Ответ 3

A SortedMap является логическим/лучшим выбором, однако другой вариант заключается в использовании LinkedHashMap, который поддерживает два режима заказа, последний - последний добавляется последним, а последний раз доступ к последним. См. Javadocs для более подробной информации.

Ответ 4

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

Ответ 5

При использовании чисел в качестве ключа, я полагаю, вы также можете попробовать следующее:

        Map<Long, String> map = new HashMap<>();
        map.put(4L, "The First");
        map.put(6L, "The Second");
        map.put(11L, "The Last");

        long lastKey = 0;
        //you entered Map<Long, String> entry
        for (Map.Entry<Long, String> entry : map.entrySet()) {
            lastKey = entry.getKey();
        }
        System.out.println(lastKey); // 11

Ответ 6

В таком случае обычно используется последний использованный ключ, поэтому его можно использовать для доступа к последнему значению (вставленному с одним):

class PostIndexData {
    String _office_name;
    Boolean _isGov;
    public PostIndexData(String name, Boolean gov) {
        _office_name = name;
        _isGov = gov;
    }
}
//-----------------------
class KgpData {
    String _postIndex;
    PostIndexData _postIndexData;
    public KgpData(String postIndex, PostIndexData postIndexData) {
        _postIndex = postIndex;
        _postIndexData = postIndexData;;
    }
}

public class Office2ASMPro {
    private HashMap<String,PostIndexData> _postIndexMap = new HashMap<>();
    private HashMap<String,KgpData> _kgpMap = new HashMap<>();
...
private void addOffice(String kgp, String postIndex, String officeName, Boolean gov) {
            if (_postIndexMap.get(postIndex) == null) {
                _postIndexMap.put(postIndex, new PostIndexData(officeName, gov));
            }
            _kgpMap.put( kgp, new KgpData(postIndex, _postIndexMap.get(postIndex)) );
        }

Ответ 7

Find missing all elements from array
        int[] array = {3,5,7,8,2,1,32,5,7,9,30,5};
        TreeMap<Integer, Integer> map = new TreeMap<>();
        for(int i=0;i<array.length;i++) {
            map.put(array[i], 1);
        }
        int maxSize = map.lastKey();
        for(int j=0;j<maxSize;j++) {
            if(null == map.get(j))
                System.out.println("Missing 'enter code here'No:"+j);
        }