Как переместить конкретную запись HashMap в последнюю позицию?
Например, у меня есть значения HashMap, такие как:
HashMap<String,Integer> map = new HashMap<String,Integer>();
map= {Not-Specified 1, test 2, testtest 3};
«Not-Specified» может входить в любой должность. это может прийти первым или в середине карты. Но я хочу переместить «Не указано» в последнюю позицию.
Как я могу это сделать? заранее спасибо.
Чтобы ответить на ваш вопрос одним предложением:
По умолчанию у Карт нет последней записи, это не часть их контракта.
И примечание: рекомендуется кодировать с интерфейсами, а не с классами реализации (см. Эффективная 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
Если вы должны полагаться на 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
HashMap не имеет «последняя позиция» , так как она не отсортирована.
Вы можете использовать другую Map
, которая реализует java.util.SortedMap
, наиболее популярным является TreeMap
.
move не имеет смысла для хэш-карты, поскольку это словарь с хэш-кодом для группирования на основе ключа, а затем связанный список для конфликтующих хэш-кодов, разрешенных с помощью равенства. Используйте TreeMap для отсортированных карт, а затем передайте пользовательский компаратор.