大文字と小文字を無視して Map<String, ?> を取得および配置する良い方法はありますか?[重複]

StackOverflow https://stackoverflow.com/questions/212562

  •  03-07-2019
  •  | 
  •  

質問

この質問にはすでに答えがあります:

何か良い方法はありますか? 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.Collat​​or) を備えた TreeMap を使用します。残念ながら、Java ライブラリには hashCode/equals に相当する Comparator がありません。

ライセンスのあるApacheを使用できます CaseInsensitiveMap で議論されたこちら。 Apache Commonsバージョンとは異なり、キーの大文字と小文字は保持されます。 TreeMapよりも厳密にマップコントラクトを実装します(さらに優れた同時セマンティクスがあります)(詳細についてはブログのコメントを参照してください)。

Trove4j は、HashMapにカスタムハッシュを使用できます。ただし、ハッシュコードをキャッシュできないことを考えると、これはパフォーマンスに影響を与える可能性があります(ただし、Trove4jはこれを回避する方法を見つけたかもしれません)。ラッパーオブジェクト(John Mによる説明)には、このキャッシュの欠陥はありません。 TreeMapに関する他の回答も参照してください。

以下のリンクで受け入れられた回答を確認してください。 マップのキーを確認する方法ケースに関係なく?

下の行は&quot;最も簡単な解決策は、挿入/チェックする前にすべての入力を大文字(または小文字)に変換することです。一貫性を確保するためにこれを行う独自のMapラッパーを作成することもできます。&quot;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top