Как получить ключ java.util.map из значения

1

У меня есть карта Map<String, Integer>. Мне нужно отсортировать значения и получить ключ от первого значения после сортировки.

Я сделал что-то вроде этого Set<Integer> set = new TreeSet<>(map.values()); , Теперь значения отсортированы, как мне получить ключ первого элемента в отсортированных значениях.

Я также приветствую лучший способ добиться этого.

Теги:
sorting
map

6 ответов

2

Вы можете рассматривать TreeSet<Map.Entry> а не TreeSet<Integer> (заполняя его с помощью entrySet с вашей существующей карты) и используя Comparator<Map.Entry>. Затем в вашей реализации Comparator<Map.Entry> сравните на основе значений. Затем у вас все еще есть ключи и значения, связанные друг с другом.

  • 0
    Как использовать Comparator<Map.Entry> и entrySet() одновременно, поскольку конструктор TreeSet может принимать только один из них.
  • 0
    @erictesting: Вы создаете с помощью компаратора, затем многократно добавляете из entrySet в расширенный цикл for . Например (после создания) for (Map.Entry entry : originalMap.entrySet()) { treeSet.add(entry); }
0

Как получить ключ первого элемента в отсортированных значениях.

Не самый эффективный способ, но вы можете вызвать этот метод с первым элементом вашего отсортированного 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.");
}
0
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();
  • 0
    зачем OP делать сортировку в цикле?
  • 0
    это просто пример использования Map.Entry. Все остальное не имеет значения, здесь только для примера.
0

Ваше требование не определено. Что делать, если два ключа сопоставляются с одним и тем же значением - какой из них следует извлечь?

Лучшее, что вы можете сделать, учитывая, что у вас есть карта, - это использовать 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));
}
0
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;
  }
}
-2

Используйте Map.entrySet(), он содержит значения вместе со своими ключами.

  • 2
    но вы не сможете различить, какой из них является ключом первого значения, так как значения отсортированы после того, как вынуты из карты, верно?
  • 0
    Вы не сможете различить равные значения, но, кроме этого, вы можете просто перебирать множество, пока не найдете свое значение !?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню