r.s*_*r.s 157 java dictionary case-insensitive
我想使用不区分大小写的字符串作为HashMap键,原因如下.
<key, value>
从HashMap中找到忽略我从流量中收到的情况.我遵循了这种方法
CaseInsensitiveString.java
public final class CaseInsensitiveString {
private String s;
public CaseInsensitiveString(String s) {
if (s == null)
throw new NullPointerException();
this.s = s;
}
public boolean equals(Object o) {
return o instanceof CaseInsensitiveString &&
((CaseInsensitiveString)o).s.equalsIgnoreCase(s);
}
private volatile int hashCode = 0;
public int hashCode() {
if (hashCode == 0)
hashCode = s.toUpperCase().hashCode();
return hashCode;
}
public String toString() {
return s;
}
}
Run Code Online (Sandbox Code Playgroud)
LookupCode.java
node = nodeMap.get(new CaseInsensitiveString(stringFromEvent.toString()));
Run Code Online (Sandbox Code Playgroud)
因此,我正在为每个事件创建一个CaseInsensitiveString的新对象.因此,它可能会影响性能.
有没有其他方法可以解决这个问题?
Roe*_*ker 285
Map<String, String> nodeMap =
new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
Run Code Online (Sandbox Code Playgroud)
这就是你真正需要的一切.
Vis*_*hal 56
正如GuidoGarcía在回答中所建议的那样:
import java.util.HashMap;
public class CaseInsensitiveMap extends HashMap<String, String> {
@Override
public String put(String key, String value) {
return super.put(key.toLowerCase(), value);
}
// not @Override because that would require the key parameter to be of type Object
public String get(String key) {
return super.get(key.toLowerCase());
}
}
Run Code Online (Sandbox Code Playgroud)
要么
Ste*_*n C 14
一种方法是创建Apache Commons AbstractHashedMap
类的自定义子类,重写hash
和isEqualKeys
方法以执行不区分大小写的散列和键的比较.(注意 - 我自己从未尝试过这个...)
这样可以避免每次需要进行地图查找或更新时创建新对象的开销.常见的Map
操作应该是O(1)......就像常规操作一样HashMap
.
如果您准备接受他们所做的实施选择,Apache Commons 将为您CaseInsensitiveMap
定制/专业化AbstractHashedMap
.
但是如果O(logN)get
和put
操作是可接受的,那么TreeMap
带有不区分大小写的字符串比较器是一个选项; 例如使用String.CASE_INSENSITIVE_ORDER
.
如果你不介意每次做一个put
或者创建一个新的临时String对象get
,那么Vishal的答案就好了.(虽然,我注意到如果你这样做,你就不会保留钥匙的原始情况......)
子类HashMap
并创建一个版本,用于降低键入put
和get
(以及可能是其他面向键的方法).
或者将a HashMap
合成到新类中并将所有内容委托给地图,但转换键.
如果您需要保留原始密钥,则可以维护双映射,也可以将原始密钥与值一起存储.
我想到了两个选择:
s.toUpperCase().hashCode();
作为Map
.TreeMap<String>
与Comparator
忽略大小写的自定义一起使用。否则,如果您更喜欢您的解决方案,而不是定义一种新的 String,我宁愿实现一个具有所需大小写不敏感功能的新 Map。
归档时间: |
|
查看次数: |
115214 次 |
最近记录: |