Java 从映射中的值查找键

Java 从映射中的值查找键,java,treemap,Java,Treemap,所以我在理解如何做到这一点上有点困难。我正在使用Map在Java中构建一个单词计数器,其中一个单词是字符串,该单词在.txt文档中被说出的次数是整数。这一切都很好…但我正在尝试开发一个部件,它将在底部显示前5个结果-->前5个map.values()是什么 我遇到的问题是,在找到值之后,我无法使用它获取字符串 任何建议都会对我很有帮助。a)迭代地图,这样您就可以访问键和值: for (Map.Entry<String, Object> entry : map.entrySet())

所以我在理解如何做到这一点上有点困难。我正在使用
Map
在Java中构建一个单词计数器,其中一个单词是
字符串
,该单词在.txt文档中被说出的次数是
整数
。这一切都很好…但我正在尝试开发一个部件,它将在底部显示前5个结果-->前5个
map.values()
是什么

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

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

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

for (Map.Entry<String, Object> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    // ...
}
for(Map.Entry:Map.entrySet()){
String key=entry.getKey();
整数值=entry.getValue();
// ...
}
b) 为反向查找构建第二个映射,例如映射-注意,这可能不是一个好主意,因为您可能有重复的键(不同单词的数字相同)


C)考虑使用一个BIdiAP——这是一个地图,你可以通过关键字和值来查询它。

< p>你需要使用<代码> map。p>
values()
方法只返回值,而
keySet()
方法只返回键

首先,您应该根据值对地图进行排序,以获得前五名结果。 直接的方法使用
比较器
。更多信息请参见答案

然后,只需获取
map.getEntrySet()
的前五个条目。使用
迭代器
更容易做到这一点

更新:

    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 --;
    }
Set=wordCount.entrySet();
列表=新的ArrayList(集合);
Collections.sort(list,newcomparator(){
公共整数比较(Map.Entry o1,Map.Entry o2){
返回o2.getValue().compareTo(o1.getValue());
}
});
int topResults=5;
迭代器iter=list.Iterator()//请参阅已排序的集合
while(iter.hasNext()&&topResults>0){
Map.Entry=iter.next();
System.out.println(entry.getKey()+“->”+entry.getValue());
顶级结果--;
}

我建议您重写
Comparator
,并基于它构建映射构造函数。 代码如下所示:

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

}
类ValueComparator实现Comparator{
地图;
公共价值比较(Map){
this.map=map;
}
公共整数比较(对象keyA、对象keyB){
可比值a=(可比)map.get(keyA);
可比值b=(可比)map.get(keyB);
返回值b.比较到(值a);
}
}
公共课你的课{
公共静态void main(字符串[]args){
HashMap=newHashMap();
地图.put(a,10);;
地图放置(“b”,30);
地图放置(“c”,50);
地图放置(“d”,40);
地图.put(e,20);;
系统输出打印项次(map);
Map sortedMap=sortByValue(Map);
系统输出打印项次(分类地图);
}
公共静态映射sortByValue(映射未排序映射){
Map sortedMap=新树映射(新值比较器(unsortedMap));
分类地图putAll(未分类地图);
返回分拣的DMAP;
}
}

您的代码仅告知前5个值的值。实际上没有显示最高值,然后是第二高值,等等这段代码将在您执行Collections.sort之后使用,使用基于比较器的方法,如链接的答案所示。我将我尝试的放在上面,它仍然不起作用,是我做错了吗?有一个小错误。
迭代器
仍在原始映射上,未排序。
列表
集合是已排序的集合。因此,迭代器应该指向
list
。这就解决了问题。
Map
被命名为wordCount您的
ValueComparator
也将删除具有重复值的条目。