0

そこで私がやろうとしていたのは、以前持っていた TreeMap を使用して、それをこのメソッドに適用し、それをセットに変換してマップ エントリ ループを通過させることです。私がやりたいことは、以前の TreeMap を反対の (反転した) TreeMap に反転することです

コードを実行すると、同等のエラーが発生します。これは、同等の方法を実装する必要があるということですか? arrayList を Integer に変換したので、同等のメソッドでサポートされると思いました。それとも、私のコードに問題があるだけですか

エラー: スレッド「メイン」の例外 java.lang.ClassCastException: java.util.ArrayList を java.lang.Comparable にキャストできません

概要: 当初、このプログラムの意図した目的は、テキスト ドキュメントから読み取り、すべての単語と単語が配置されている場所のインデックス/行を具体的に見つけるツリーマップを作成することでした。ここで、最もよく使用される単語を含む「トップ 10」リストを作成したいと考えています。整数値が順番に並べられ、文字列が続くように、ツリーマップを「反転」したかった

public static void getTopTenWords(TreeMap<String, ArrayList<Integer>> map) {
    Set<Map.Entry<String, ArrayList<Integer>>> set = map.entrySet();
    TreeMap<Integer, String> temp = new TreeMap<Integer, String>();
    int count = 1;
    for(Map.Entry<String, ArrayList<Integer>> entry : set){
        if(temp.containsKey(entry.getValue())) {
            Integer val = entry.getValue().get(count);
            val++;
            temp.put(val, entry.getKey());
        }
        else {
            temp.put(entry.getValue().get(count), entry.getKey());
        }
        count++;
     }

}
4

1 に答える 1

1

ここで、最もよく使用される単語を含む「トップ 10」リストを作成したいと考えています。整数値が順番に並べられ、文字列が続くように、ツリーマップを「反転」したかった

Mapaには一意のキーのみが含まれていることに注意してください。countそのため、 as キーを保持しようとする場合はMap、新しいオブジェクトをnew Integer(count).

Map- のようにカウントを入れると、値がにキャッシュされるmap.put(2, "someword")ため、以前のカウント値が上書きされる可能性があります。したがって、これらの範囲の間の整数値は、新しいオブジェクトを作成しない場合になります。したがって、値を持つ2つは同じを指すため、キーが重複します。Integerrange: - [-128 to 127]internedInteger2Integer object

第二に、あなたのコードで: -

if (temp.containsKey(entry.getValue()))

ArrayList上記の if ステートメントを使用して、値と比較していIntegerます。tempが含まれkeyていますintegers。の値はentryですArrayList。したがって、実行時に失敗します。また、orginalマップには でword見つかった の場所だけが含まれているため、text file. したがって、必要なことは、arraylist各単語のサイズを取得し、それをキーにすることです。

コードを少し変更する必要があります。

public static void getTopTenWords(TreeMap<String, ArrayList<Integer>> map) {
    Set<Map.Entry<String, ArrayList<Integer>>> set = map.entrySet();

    TreeMap<Integer, String> temp = new TreeMap<Integer, String>();

    for(Map.Entry<String, ArrayList<Integer>> entry : set) {
        int size = entry.getValue().size();
        int word = entry.getKey();

        temp.put(new Integer(size), word));    
    }
}

ご覧のとおり、 の を使用しsizeましvaluesentry set。そして、それを に入れkeyますTreeMap。使い方new Integer(size)も大事です。すべての整数参照が新しいオブジェクトを指していることを保証します。したがって、重複はありません。

また、値を昇順でTreeMapソートすることに注意してください。Integerあなたの最も頻繁な言葉は、最後のどこかにあるでしょう。

于 2012-11-13T06:12:39.013 に答える