は、私は現在、私は私が呼ばれてきたラッパークラスCaseInsensitiveString
次のようになりますそのためのコードで私のString
オブジェクトをラップしています CASEINSENSITIVE地図キーのJava
Map<String, Object>
を持っています:
/**
* A string wrapper that makes .equals a caseInsensitive match
* <p>
* a collection that wraps a String mapping in CaseInsensitiveStrings will still accept a String but will now
* return a caseInsensitive match rather than a caseSensitive one
* </p>
*/
public class CaseInsensitiveString {
String str;
private CaseInsensitiveString(String str) {
this.str = str;
}
public static CaseInsensitiveString wrap(String str) {
return new CaseInsensitiveString(str);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null) return false;
if(o.getClass() == getClass()) { //is another CaseInsensitiveString
CaseInsensitiveString that = (CaseInsensitiveString) o;
return (str != null) ? str.equalsIgnoreCase(that.str) : that.str == null;
} else if (o.getClass() == String.class){ //is just a regular String
String that = (String) o;
return str.equalsIgnoreCase(that);
} else {
return false;
}
}
@Override
public int hashCode() {
return (str != null) ? str.toUpperCase().hashCode() : 0;
}
@Override
public String toString() {
return str;
}
}
私はMap<CaseInsensitiveString, Object>
はまだMap#get(String)
を受け入れ、Map#get(CaseInsensitiveString.wrap(String))
を行うことなく、値を返すために得ることができるように期待していました。しかし、私のテストでは、私はこれを行うにしようとした時はいつでも私のHashMap
はnullを返しましたが、私は私のHashMap
が取得するために文字列とCaseInsensitiveString
両方のパラメータを受け入れることができるようにget()
ことが可能ですを呼び出す前に、文字列をラップする場合には機能しませんメソッドと作業を行う場合は、String
がラップされているかどうかにかかわらず、非機密ファッションで作業してください。もしそうなら、何が間違っていますか?
参考のために私のテストコードは次のようになります。
Map<CaseInsensitiveString, String> test = new HashMap<>();
test.put(CaseInsensitiveString.wrap("TesT"), "value");
System.out.println(test.get("test"));
System.out.println(test.get(CaseInsensitiveString.wrap("test")));
とリターン:予想通り
null
value
主に速度の検討事項に応じて、['String.CASE_INSENSITIVE_ORDER']で' TreeMap'を使用できます(https://docs.oracle.com/javase/7/docs/api/java/lang /String.html#CASE_INSENSITIVE_ORDER)。 –
自分のマップを拡張して、パットしたり取得したりするときにストリングを大文字/小文字に変換するだけでは、このトリックはできません。 –
あなたは、すべてのキーを小文字(または大文字)に格納することができます。クエリの前には、クエリ文字列を小文字に変換します。 –