从地图中的价值中寻找关键

时间:2016-04-18 22:14:37

标签: java treemap

所以我在理解如何做到这一点时遇到了一些麻烦。我正在使用Map<String, Integer>在Java中构建一个字计数器,其中一个单词是String,并且.txt文档中该单词的表示次数为Integer。这一切都很有效......但我正在努力开发一个部分,它将在底部显示前5个结果是什么---&gt;前五名map.values()是什么。

我遇到的问题是在找到值后,我无法使用它获取字符串。

任何建议都对我很有帮助。

3 个答案:

答案 0 :(得分:2)

您需要使用Map.Entry<String, Integer>来获取密钥和值对。

values()方法仅返回值,而keySet()方法仅返回键。

首先,您应该根据值对地图进行排序,以获得前五个结果。 直截了当的方法使用Comparator。请参阅答案here了解更多信息。

然后您只需获取map.getEntrySet()的前五个条目。使用Iterator会更容易。

更新:

    Set<Entry<String, Integer>> set = wordCount.entrySet();
    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
        public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
            return o2.getValue().compareTo(o1.getValue());
        }
    });

    int topResults = 5;
    Iterator<Entry<String, Integer>> iter = list.iterator(); //refer the sorted collection
    while (iter.hasNext() && topResults > 0 ) {
        Map.Entry<String, Integer> entry = iter.next();
        System.out.println(entry.getKey() + "->" + entry.getValue());
        topResults --;
    }

答案 1 :(得分:0)

a)迭代地图,这样你就可以访问键和值:

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    // ...
}

b)构建第二个反向查找地图,例如地图 - 请注意,这可能不是一个好主意,因为您可能有重复的键(不同单词的数字相同)

c)考虑使用bidimap - 这是一个可以按键和按值查询的地图。

答案 2 :(得分:0)

我建议你覆盖Comparator并根据它构建你的Map构造函数。 代码如下所示:

class ValueComparator implements Comparator {
    Map map;

    public ValueComparator(Map map) {
        this.map = map;
    }

    public int compare(Object keyA, Object keyB) {
        Comparable valueA = (Comparable) map.get(keyA);
        Comparable valueB = (Comparable) map.get(keyB);
        return valueB.compareTo(valueA);
    }
}

public class YourClass{
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 20);
        System.out.println(map);

        Map sortedMap = sortByValue(map);
        System.out.println(sortedMap);
    }

    public static Map sortByValue(Map unsortedMap) {
        Map sortedMap = new TreeMap(new ValueComparator(unsortedMap));
        sortedMap.putAll(unsortedMap);
        return sortedMap;
    }

}