【发布时间】:2011-11-19 21:23:10
【问题描述】:
我需要有一个 自动 在 Java 中按值排序的映射 - 以便在我添加新的键值对或更新现有的键值对,甚至删除一些条目。
还请记住,这张地图将会非常大(大小为 100 的数千,甚至是 10 的数百万条目)。
所以基本上我正在寻找以下功能:
假设我们有一个实现上述功能的“SortedByValuesMap”类 我们有以下代码:
SortedByValuesMap<String,Long> sorted_map = new SortedByValuesMap<String, Long>();
sorted_map.put("apples", 4);
sorted_map.put("oranges", 2);
sorted_map.put("bananas", 1);
sorted_map.put("lemons", 3);
sorted_map.put("bananas", 6);
for (String key : sorted_map.keySet()) {
System.out.println(key + ":" + sorted_map.get(key));
}
输出应该是:
bananas:6
apples:4
lemons:3
oranges:2
尤其是对我来说真正重要的是能够获得带有 任何时候的最低值 - 使用如下命令:
smallestItem = sorted_map.lastEntry();
这应该给我“橙子”条目
编辑:我是 Java 新手,所以请详细说明您的答案 - 谢谢
EDIT2:这可能会有所帮助:我正在使用它来计算巨大文本文件中的单词(对于那些熟悉的人:特别是 n-gram)。所以我需要建立一个地图,其中键是单词,值是这些单词的频率。但是,由于限制(如 RAM),我只想保留 X 最常用的词——但你不能事先知道哪些是最常用的词。因此,我认为它可能起作用的方式(作为近似值)是开始计算单词,当地图达到上限(如 1 百万个条目)时,将删除最不频繁的条目以保持地图的大小100 万。
【问题讨论】:
-
数以百万计的条目?为什么不使用数据库呢?
-
如果有两个具有相同最小值的键怎么办?
lastEntry()的预期行为应该是什么? (例如,limes的另一个条目 ->2在地图中) -
@Kru:数据库会让它变得非常慢
-
如果这只是英语,那么您高估了单词的数量,尤其是常用的单词。
-
@Dave Newton 你是对的 - 我提到了一些词,以免让不熟悉 n-gram 的人感到困惑,这正是我实际计算的。 N-grams,尤其是随着 N 的增加,可以变得非常多样化。可能的组合呈指数增长。
标签: java data-structures collections associative-array sorted