1

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

例如,

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

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

这里还有其他建议吗?

4

6 回答 6

4

优先权。

您可以创建一个类来放入它:

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

    //Compare to and equals methods
}

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

于 2012-08-02T14:50:25.583 回答
3

只需使用排序地图,如

Map<Integer, List<String>> strings

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

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


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

于 2012-08-02T14:52:03.353 回答
0

对于诸如“查找 N 个最重要的项目”之类的任何任务,优先级队列都是完美的解决方案。请参阅 Java 的PriorityQueue类。

于 2012-08-02T14:52:00.743 回答
0

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

于 2012-08-02T14:59:32.187 回答
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.
于 2012-08-02T15:04:15.753 回答
0

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

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

于 2012-08-03T17:01:04.617 回答