为了账号安全,请及时绑定邮箱和手机立即绑定

不区分大小写的字符串作为HashMap键

不区分大小写的字符串作为HashMap键

慕的地10843 2019-11-12 10:44:22
由于以下原因,我想使用不区分大小写的字符串作为HashMap键。在初始化期间,我的程序使用用户定义的String创建HashMap。在处理事件(在我的情况下为网络流量)时,我可能会在其他情况下收到String,但是我应该能够<key, value>忽略HashMap中的来自流量的情况而从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;            }    }LookupCode.java    node = nodeMap.get(new CaseInsensitiveString(stringFromEvent.toString()));因此,我为每个事件创建一个CaseInsensitiveString新对象。因此,它可能会影响性能。还有其他解决方法吗?
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

Map<String, String> nodeMap = 

    new TreeMap<>(String.CASE_INSENSITIVE_ORDER);

这就是您真正需要的。


查看完整回答
反对 回复 2019-11-12
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

一种方法是创建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的回答就很好。(尽管如此,如果您这样做,您将不会保留键的原始大小写……)


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 1012 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信