3

短い Java コードをコンパイルすると、安全でない操作があるというコンパイル ノートが表示されます。基本的に、データ構造を変更して安全にする方法の概念を望んでいました。

コンセプト: 入力された文字列を長さに基づいてバケットに整理する必要がありますが、これは任意である可能性があります (ただし、80 文字未満)。

コード:

Map<Integer, List> buckets = new HashMap<Integer, List>();
            if(!buckets.containsKey(length))
            {
                buckets.put(length,new Vector<wordValues>());
            }
            //Now add the temp to the bucket
            buckets.get(length).add(new wordValues(temp));

次に、そのサイズに対応するリストに文字列を追加します。

これを行うためのより良い方法は何でしょうか?

4

2 に答える 2

10

生とジェネリックリストを混ぜて、試してください:

Map<Integer, List<wordValues>> buckets = new HashMap<Integer, List<wordValues>>();

また、通常、クラス名は大文字で始まりWordValuesます。

于 2012-09-01T18:07:00.847 に答える
3

問題は、パラメーター化されたジェネリック型ではなく生の型 を使用していることです。ジェネリックについては、Oracle Java チュートリアルで詳しく説明されています。List List<WordValues>

Map<Integer, List<WordValues>> buckets = new HashMap<>();
...
List<WordValues> values = buckets.get(length);
if (values == null) {
  values = buckets.put(length, new ArrayList<WordValues>());
}
values.add(new WordValues(temp));

いくつかのヒント:

  • containsKeygetどちらも同一のルックアップを行います。それを2回行うのはちょっと奇妙に思えます:-p
  • Vectorを優先して使用することは避けてくださいArrayList。同期する必要がある場合は、 を介して装飾することを検討してCollections.synchronizedListください。

    Collections.synchronizedList(new ArrayList<WordValues>())
    
  • Java 7 は型パラメーターの推論をサポートしているため、負担が大幅に軽減されます。上記のように入力する必要はありませんでしたHashMap<Integer, List<WordValues>>HashMap<>代わりに、新しいダイヤモンド演算子を利用して、単に入力しました。
  • 小文字で始まるクラス名は使用しないでください。これは一般的に読みにくいです (そしてOracle Code Conventionsに反します)。WordValuesではなく、クラスに名前を付けることを検討してくださいwordValues
于 2012-09-01T18:59:04.783 に答える