我正在开发一个程序,我正在读取文件并提取关键字及其计数。后来我需要选择最高频率的单词并将其与关键字匹配。
我已将我在文件中找到的所有关键字存储在字符串列表中。 我希望根据频率对这些进行排序。因此,如果在索引17处我有一个单词“stack”,其他整数列表中的索引17处的值最大,我希望将它们带到位置1.
我可以使用collections.sort对它们进行排序,但它不会处理其他列表。
这是我的代码:
while(m.find())
{
if(keyword.contains(m.group()))
{
keywordcount.set(keyword.indexOf(m.group()),keywordcount.get(keyword.indexOf(m.group()))+1);
//System.out.println("*"+m.group()+":"+keywordcount.get(keyword.indexOf(m.group())));
}
else
{
keyword.add(m.group());
int var=keyword.indexOf(m.group());
//System.out.println(m.group()+":"+var);
keywordcount.add(var, 1);
}
//System.out.println(keyword.size()+"#"+keywordcount.size());
}
for(int i=0;i<keyword.size();i++)
{
System.out.print(keyword.get(i)+ ":" +keywordcount.get(i)+" ");
}
答案 0 :(得分:5)
通常,人们会将String
和Integer
放入一个类中,并对该类的实例列表进行排序。
E.g。
class StringCount implements Comparable<StringCount> {
private final String string;
private final int count;
public StringCount(String string, int count) {
this.string = string;
this.count = count;
}
@Override
public int compareTo(StringCount right) {
return this.count < right.count ? -1
: this.count > right.count ? 1
: 0;
}
// implement equals and hashCode too
// if a.compareTo(b) == 0, then a.equals(b) should return true.
}
然后,您可以创建List<StringCount>
并致电Collections.sort(stringCountList)
。
请注意,这会首先将StringCount
个实例设为最低值,因此它们会按升序排列。
答案 1 :(得分:1)
final List<String> words = new ArrayList<>();
final Map<String, Integer> frequencies = new HashMap<>();
while (m.find()) {
String word = ...extract the word from m...;
if (!words.contains(word)) words.add(word);
if (!frequencies.contains(word)) frequencies.put(word, 1);
else frequencies.put(word, frequencies.get(word) + 1);
}
Collections.sort(words, new Comparator<String>() {
@Override public int compare(String s1, String s2) {
int f1 = frequencies.get(s1);
int f2 = frequencies.get(s2);
if (f1 < f2) return 1;
if (f1 > f2) return -1;
return 0;
}
});
答案 2 :(得分:1)
这可能是检查multisets的理想时刻。
支持与顺序无关的相等性的集合,如Set,但可能包含重复的元素。 multiset有时也被称为包。
多个集合中彼此相等的元素称为相同单个元素的出现。多集中元素的出现总数称为该元素的计数(术语“频率”和“多重性”是等效的,但在此API中未使用)。由于元素的计数表示为int,因此多重集可能永远不会包含任何一个元素的Integer.MAX_VALUE次数。