从地图中的值中找到键
Finding the Key from Value in Map
所以我在理解如何执行此操作时遇到了一些麻烦。我正在使用 Map<String, Integer>
在 Java 中构建一个单词计数器,其中一个单词是 String
并且该单词在 .txt 文档中被说的次数是 Integer
。这一切都很好......但我正在尝试开发一个部分,它将在底部显示前 5 个结果是什么 ---> 前 5 个 map.values()
是什么。
我 运行 遇到的问题是在找到值后,我无法用它获取字符串。
任何建议都会对我很有帮助。
a) 遍历地图,这样您就可以访问键和值:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
// ...
}
b) 构建第二张地图用于反向查找,例如地图 - 请注意,这可能不是一个好主意,因为您可能有重复的键(不同单词的相同数字)
c) 考虑使用 bidimap - 这是一个可以通过键和值查询的映射。
您需要使用 Map.Entry<String, Integer>
来获取键值对。
values()
方法 returns 仅值,而 keySet()
方法 returns 仅键。
首先,您应该根据值对地图进行排序,以获得前五个结果。
直接的方法使用 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 --;
}
我建议您覆盖 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;
}
}
所以我在理解如何执行此操作时遇到了一些麻烦。我正在使用 Map<String, Integer>
在 Java 中构建一个单词计数器,其中一个单词是 String
并且该单词在 .txt 文档中被说的次数是 Integer
。这一切都很好......但我正在尝试开发一个部分,它将在底部显示前 5 个结果是什么 ---> 前 5 个 map.values()
是什么。
我 运行 遇到的问题是在找到值后,我无法用它获取字符串。
任何建议都会对我很有帮助。
a) 遍历地图,这样您就可以访问键和值:
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
// ...
}
b) 构建第二张地图用于反向查找,例如地图 - 请注意,这可能不是一个好主意,因为您可能有重复的键(不同单词的相同数字)
c) 考虑使用 bidimap - 这是一个可以通过键和值查询的映射。
您需要使用 Map.Entry<String, Integer>
来获取键值对。
values()
方法 returns 仅值,而 keySet()
方法 returns 仅键。
首先,您应该根据值对地图进行排序,以获得前五个结果。
直接的方法使用 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 --;
}
我建议您覆盖 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;
}
}