2

キーの大文字と小文字を区別せずに java.util.HashMap にアクセスしたい。

つまり、次のエントリを HashMap に追加すると、次のようになります。

java.util.HashMap<String, Object> myMap = new java.util.HashMap<String, Object>();
myMap.put("foo", new Foo());  // Note lower-case key used here

次に、次のコードで Foo オブジェクトを取得できるはずです。

Foo f = (Foo) myMap.get("FOO"); // Note UPPER-case key used here

これは可能ですか?

ありがとう。

4

7 に答える 7

9
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class TestEnum {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Map<String, String> oldMap = new HashMap<String, String>();
        oldMap.put("akshay", "Lokur");
        oldMap.put("sumiT", "BORhade");

        Map<String, String> newMap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
        newMap.putAll(oldMap);
        String value = newMap.get("AKShay");
        System.out.println(value);
    }

}
于 2013-02-05T07:44:35.073 に答える
4

HashMap をサブクラス化して、独自の「MyIgnoreCaseHashMap」を使用します。

public class MyIgnoreCaseHashMap extends HashMap<String, Object> {

    Object get(String key) {
       return super.get(key.toLowercase());
    }

    void put(String key, Object value) {
       super.put(key.toLowerCase(), value);
    }
}

これは、キーを常に小文字バージョンで処理します。また、containsKey など、キーを使用する可能性があるメソッドをオーバーライドすることを検討してください。

また、外部ライブラリを含めることを気にしない場合は、apache-commons に CaseInsensitiveMap クラスがあり、問題を解決できます。

于 2013-02-05T07:30:02.333 に答える
1

なぜこれが必要なのかわかりません:

しかし、myMap好きに追加することを検討してください

myMap.put("foo".toLowerCase(), new Foo());

のように取得する

Foo f = (Foo) myMap.get("FOO".toLowerCase());
于 2013-02-05T07:27:44.937 に答える
1

簡単な解決策は、次のように使用する前にすべてのキーを大文字に変換することです。

myMap.put (key.toUpperCase (), value);
String value = myMap.get (anotherKey.toUpperCase ());
于 2013-02-05T07:28:39.440 に答える
0

マップを使用するたびに「toLowerCase」を繰り返し使用したくない場合は、この目的のために HashMap の独自のサブクラスを作成できます。get、、、およびputをオーバーライドしてキーを小文字に変換し、スーパークラスでこの小文字のキーを使用して適切な関数を呼び出します。containsKeyremove

toLowerCase()/はロケールによって動作が異なることに注意してください。そのtoUpperCase()ため、JVM が実行されている場所だけに基づいて異なる結果が得られるリスクがあります。これは、キーとして使用している文字列 (ユーザー入力、ハードコードなど) に応じて、望ましい場合とそうでない場合があります。toUpperCase(Locale locale)一貫した大文字と小文字の規則が必要かどうかを検討してください。

于 2013-02-05T07:38:44.627 に答える
0

完全に肉付けされた例については、Apache Commons db utils を見てください...具体的には、プライベート内部クラスorg.apache.commons.dbutils.BasicRowProcessor$CaseInsensitiveHashMapをソースします

https://apache.googlesource.com/commons-dbutils/+/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java

これは、一部の JDBC ドライバーで使用され、Oracle などの大文字と小文字を区別しない列名データベースの結果クエリであるマップにアクセスします。

于 2014-01-17T02:48:04.063 に答える
0

これを行うには、オブジェクトをマップにプッシュ/取得する前にキーを大文字に変換します。お気に入り:

myMap.put("foo".toUpperCase(), new Foo());

Foo f = myMap.get("foo".toUpperCase());

または

myMap.put("foo".toLowerCase(), new Foo());

Foo f = myMap.get("foo".toLowerCase());
于 2013-02-05T07:27:09.727 に答える