0

私はファイルを読んでキーワードとその数を抽出しているプログラムに取り組んでいます。後で、最も頻度の高い単語をピックアップして、キーワードと一致させる必要があります。

ファイルで見つけたすべてのキーワードを文字列リストに保存しました。これらを頻度に基づいて並べ替えたいと思います。したがって、インデックス17に、他の整数リストのインデックス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)+" ");
    }
4

3 に答える 3

5

通常、Stringとの両方を1Integerつのクラスに入れ、そのクラスのインスタンスのリストを並べ替えます。

例えば

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インスタンスが最初に配置されるため、昇順で表示されることに注意してください。

于 2012-04-19T12:05:48.350 に答える
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;
    }
});
于 2012-04-19T12:14:04.523 に答える
1

これは、マルチセットにチェックインするのに理想的な瞬間かもしれません。

Setのように、順序に依存しない同等性をサポートするコレクションですが、要素が重複している可能性があります。マルチセットは、バッグと呼ばれることもあります。

互いに等しいマルチセットの要素は、同じ単一要素のオカレンスと呼ばれます。マルチセット内の要素の合計発生数は、その要素のカウントと呼ばれます(「頻度」と「多重度」という用語は同等ですが、このAPIでは使用されません)。要素の数はintとして表されるため、マルチセットには、1つの要素のInteger.MAX_VALUEを超えるオカレンスを含めることはできません。

于 2012-04-19T12:44:11.640 に答える