我有一个这样的场景,我需要存储字符串的数量,我需要返回前十个具有最大数量的字符串,
例如,
String Count
---------------------------------
String1 10
String2 9
String3 8
.
.
.
String10 1
我正在考虑使用哈希表来存储字符串及其计数,但是很难从中检索前十个字符串,因为我必须再次循环遍历它才能找到它们。
这里还有其他建议吗?
我有一个这样的场景,我需要存储字符串的数量,我需要返回前十个具有最大数量的字符串,
例如,
String Count
---------------------------------
String1 10
String2 9
String3 8
.
.
.
String10 1
我正在考虑使用哈希表来存储字符串及其计数,但是很难从中检索前十个字符串,因为我必须再次循环遍历它才能找到它们。
这里还有其他建议吗?
优先权。
您可以创建一个类来放入它:
public class StringHolder{
private String string;
private int value;
//Compare to and equals methods
}
然后它会在您插入时进行排序,并且很容易获得前 10 名。
只需使用排序地图,如
Map<Integer, List<String>> strings
其中键是频率值,值是以该频率出现的字符串列表。
然后,循环遍历地图,并通过值列表进行内部循环,直到您看到 10 个字符串。这些是最常见的 10 个。
算法应该支持频率更新的附加要求:将字符串添加到映射中,例如键是字符串,值是实际频率(如果再次看到字符串,则增加值)。之后将键/值对复制到我上面建议的映射中。Map<String, Integer>
对于诸如“查找 N 个最重要的项目”之类的任何任务,优先级队列都是完美的解决方案。请参阅 Java 的PriorityQueue类。
我不确定,但我想最适合您需求的优雅类是番石榴的 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/TreeMultiset.html
Guava 有一个 HashMultiset 对此非常有用。
HashMultiset<String> ms = Hashmultiset.create();
ms.add(astring);
ms.add(astring, times);
ImmutableMultiset<String> ims = Multisets.copyHighestCountFirst(ms);
// iterator through the first 10 elements, and they will be your top 10
// from highest to lowest.
为此,您需要一个 Max Heap 数据结构。将其全部放入最大堆中,并连续进行 10 次(或任何 n 次)删除。
而且,如果您打算在将数据加载到内存后继续重用数据,那么按值排序而不是按堆排序可能是值得的。