如何从Value获取java.util.map的键

时间:2014-03-12 13:34:27

标签: java sorting map

我有Map<String, Integer>的地图。我需要对值进行排序并在排序后检索第一个值的键。

我做了类似Set<Integer> set = new TreeSet<>(map.values());的事情。 现在对值进行排序,如何获取排序值中第一个元素的键。

我也欢迎更好的方法来实现这一目标。

6 个答案:

答案 0 :(得分:2)

您可以考虑使用TreeSet<Map.Entry>而不是TreeSet<Integer>(使用现有地图中的entrySet填充它),并使用Comparator<Map.Entry>。然后在Comparator<Map.Entry>实施中,根据值进行比较。然后你仍然拥有彼此关联的键和值。

答案 1 :(得分:0)

您的要求不明确。如果两个键映射到相同的值 - 您应该检索哪一个,该怎么办?

根据您拥有的地图,您可以做的最好的事情就是使用entrySet()而不是values(),它会将键与其值配对。然后,您可以按值对Entry个对象进行排序,并检索正确的密钥。

然而,简单地将另一个Map保持在相反的方向&#34;可能会好得多。首先。大概是你在填充第一个的同时填充这个,然后你可以使用第二个Map快速检索&#34;键&#34;来自&#34;价值观。&#34;像这样:

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));
}

答案 2 :(得分: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.");
}

答案 3 :(得分: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;
  }
}

答案 4 :(得分:-1)

使用Map.entrySet(),它包含值及其键。

答案 5 :(得分:-1)

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();
相关问题