使用哪种数据结构?

时间:2012-08-02 14:47:26

标签: java data-structures

我有这样的场景, 我需要存储字符串的数量,我需要返回具有最大计数的前十个字符串

例如,

String    Count
---------------------------------
String1   10
String2   9
String3   8 
.
.
.
String10  1 

我正在考虑使用哈希表来存储字符串及其计数但是很难从中检索前十个字符串,因为我必须再次遍历它才能找到它们。

这里还有其他建议吗?

6 个答案:

答案 0 :(得分:4)

Priority Que。

你可以把一个课程放进去:

public class StringHolder{
    private String string;
    private int value;

    //Compare to and equals methods
}

然后它会在您插入时进行排序,并且很容易获得前10名。

答案 1 :(得分:3)

只需使用像

这样的有序地图
Map<Integer, List<String>> strings

其中键是频率值,值是以该频率出现的字符串列表。

然后,遍历地图,并通过值列表的内部循环,直到您看到10个字符串。这是最常见的10个。


根据附加要求算法应支持频率更新:将字符串添加到Map<String, Integer>之类的地图中,其中键是字符串,估计实际频率(如果再次看到一个字符串,则增加该值)。 之后将键/值对复制到我上面建议的地图上。

答案 2 :(得分:0)

对于像“查找N个顶级项目”这样的任务,优先级队列是完美的解决方案。请参阅Java的PriorityQueue类。

答案 3 :(得分:0)

我不确定,但我想最符合您需求的优雅类是番石榴 http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/TreeMultiset.html

答案 4 :(得分:0)

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.

答案 5 :(得分:0)

您需要Max Heap数据结构。将它全部放入最大堆中,并连续10次(或任何n次)删除。

如果你打算在数据加载到内存后继续重用数据,那么按值而不是堆排序可能是值得的。