У меня есть карта Map<String, Integer>
. Мне нужно отсортировать значения и получить ключ от первого значения после сортировки.
Я сделал что-то вроде этого Set<Integer> set = new TreeSet<>(map.values());
, Теперь значения отсортированы, как мне получить ключ первого элемента в отсортированных значениях.
Я также приветствую лучший способ добиться этого.
Вы можете рассматривать TreeSet<Map.Entry>
а не TreeSet<Integer>
(заполняя его с помощью entrySet
с вашей существующей карты) и используя Comparator<Map.Entry>
. Затем в вашей реализации Comparator<Map.Entry>
сравните на основе значений. Затем у вас все еще есть ключи и значения, связанные друг с другом.
Как получить ключ первого элемента в отсортированных значениях.
Не самый эффективный способ, но вы можете вызвать этот метод с первым элементом вашего отсортированного Set
. Этот метод предполагает, что на вашей Map
есть ненулевые значения.
private String getKeyForValue(Integer value, Map<String, Integer> map) {
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == value) {
return entry.getKey();
}
}
throw new IllegalArgumentException("The value " + value + " was not found in the map.");
}
Map<String, Integer> map = new HashMap<String, Integer>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
// do your sorting
}
// fetch the first entry here
entry.getKey();
Ваше требование не определено. Что делать, если два ключа сопоставляются с одним и тем же значением - какой из них следует извлечь?
Лучшее, что вы можете сделать, учитывая, что у вас есть карта, - это использовать entrySet()
а не values()
, который соединяет ключи со своими значениями. Затем вы можете отсортировать объекты Entry
по значению и получить правильные ключи.
Однако, вероятно, было бы намного лучше просто сохранить другую Map
в "противоположном направлении" в первую очередь. Предположительно, вы заселили это одно одновременно с заполнением первого, а затем вы могли бы использовать вторую Map
для быстрого извлечения "ключей" из "значений". Что-то вроде этого:
Map<String, Integer> originalMap = new HashMap<String, Integer>();
Map<Integer, String> reverseLookup = new HashMap<Integer, String>();
// Populate both maps at the same time, with the same data (but reversed)...
for (Integer i : originalMap.values()) {
System.out.println(reverseLookup.get(i));
}
Map<String, Integer> map = new HashMap<String,Integer>();
Set<Integer> set = new TreeSet<Integer>(map.values());
Iterator iter = set.iterator();
Integer firstValue = (Integer) iter.next();
String firstKey = null;
for(String key : map.keySet())
{
if(map.get(key) == firstValue)
{
firstKey = key;
break;
}
}
Используйте Map.entrySet(), он содержит значения вместе со своими ключами.
Comparator<Map.Entry>
иentrySet()
одновременно, поскольку конструкторTreeSet
может принимать только один из них.entrySet
в расширенный циклfor
. Например (после создания)for (Map.Entry entry : originalMap.entrySet()) { treeSet.add(entry); }