大文字と小文字を無視して Map<String, ?> を取得および配置する良い方法はありますか?[重複]
-
03-07-2019 - |
質問
この質問にはすでに答えがあります:
- HashMap キーとしての大文字と小文字を区別しない文字列 12 件の回答
何か良い方法はありますか? Map<String, ?>
大文字と小文字を無視して get および put しますか?
解決
TreeMapはMapを拡張し、カスタムコンパレーターをサポートします。
Stringは、大文字と小文字を区別しないデフォルトのコンパレータを提供します。
だから:
final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
コンパレータはロケールを考慮しません。詳細については、JavaDocを参照してください。
他のヒント
独自のMapオーバーライドput / getメソッドを実装することは可能ですか?
public class CaseInsensitiveMap extends HashMap<String, String> {
...
put(String key, String value) {
super.put(key.toLowerCase(), value);
}
get(String key) {
super.get(key.toLowercase());
}
}
この方法では、「キー」を強制的に変更することはありません。 Map実装を入力します。
大文字と小文字を区別しないequals()およびhashCode()実装を使用したStringキーのラッパークラスが必要です。マップのキーに文字列の代わりにそれを使用します。
http://www.java.happycodings.com/で実装例を参照してください。 Java_Util_Package / code3.html 2分間のグーグル検索で見つけました。私は賢明に見えますが、私はそれを使用したことはありません。
すぐに思い浮かぶ 3 つの解決策は次のとおりです。
文字列をキーとして使用する前に大文字と小文字を正規化します (トルコ語ロケールは他の地域とは異なる動作をします)。
キーとして使用するように設計された特別なオブジェクト タイプを使用します。これは、複合キーを処理するための一般的なイディオムです。
大文字と小文字を区別しないコンパレーター (おそらく PRIMARY または SECONDARY の強度 java.text.Collator) を備えた TreeMap を使用します。残念ながら、Java ライブラリには hashCode/equals に相当する Comparator がありません。
ライセンスのあるApacheを使用できます CaseInsensitiveMap で議論されたこちら。 Apache Commonsバージョンとは異なり、キーの大文字と小文字は保持されます。 TreeMapよりも厳密にマップコントラクトを実装します(さらに優れた同時セマンティクスがあります)(詳細についてはブログのコメントを参照してください)。
Trove4j は、HashMapにカスタムハッシュを使用できます。ただし、ハッシュコードをキャッシュできないことを考えると、これはパフォーマンスに影響を与える可能性があります(ただし、Trove4jはこれを回避する方法を見つけたかもしれません)。ラッパーオブジェクト(John Mによる説明)には、このキャッシュの欠陥はありません。 TreeMapに関する他の回答も参照してください。
以下のリンクで受け入れられた回答を確認してください。 マップのキーを確認する方法ケースに関係なく?
下の行は&quot;最も簡単な解決策は、挿入/チェックする前にすべての入力を大文字(または小文字)に変換することです。一貫性を確保するためにこれを行う独自のMapラッパーを作成することもできます。&quot;