テキスト処理用のコードを書いていますが、最初に文字列を整数に変換すると、処理がずっと速くなります。これを行うために、Dictionary クラスを作成しました。新しい文字列が表示されるたびにインデックスを付け、文字列から int へのマップと int から文字列へのマップの 2 つのマップを保持するので、両方の方法で簡単に検索できます。 . コードは次のとおりです。
class Dictionary {
private Map<String, Integer> map;
private Map<Integer, String> reverse_map;
private int nextIndex;
public Dictionary() {
map = new HashMap<String, Integer>();
reverse_map = new HashMap<Integer, String>();
nextIndex = 1;
}
public int getIndex(String string) {
if (!map.containsKey(string)) {
map.put(string, nextIndex);
reverse_map.put(nextIndex, string);
nextIndex++;
}
return map.get(string);
}
public String getString(int index) {
// getIndex is always called first, so we don't need to check anything
return reverse_map.get(index);
}
}
これは、私のシングルスレッドコードでうまく機能しています。しかし、今はこの複数のスレッドを使用して速度を上げたいと思っていますが、その方法がわかりません。ConcurrentHashMap を使用することを考えputIfAbsent
ましたが、インデックスを 2 回使用しないことが保証されるかどうかはわかりません。Collections.synchronizedMap を使用したくありませんでした。このディクショナリはスレッド間で非常に頻繁にアクセスされるため、読み取りと書き込みのたびにブロックされるため、単一のスレッドよりもはるかに優れているとは思われません。これを機能させる方法はありますか?