本问题已经有最佳答案,请猛点这里访问。
有什么好办法让Map获取并忽略大小写吗?
类似的问题:stackoverflow.com/questions/8236945/
TreeMap扩展了Map并支持自定义比较器。
字符串提供默认的不区分大小写的比较器。
所以:
final Map map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
比较器不考虑区域设置。在其JavaDoc中阅读有关它的更多信息。
请注意,如果您控制使用的密钥而不是最终用户,则不必担心语言环境,并且您的密钥是英语。
如果您需要一个Map,它不支持TreeMap不支持的空值,请尝试访问github.com/jdereg/java-util上的CaseInsenstiveMap。这与O(log n)的TreeMap不同,在O(1)中访问Map。
您可以使用Apache Commons Collections中的CaseInsensitiveMap。
请注意,CaseInsensitiveMap不是通用的,因此您不能对此执行Map。
从4.0版开始,Apaches Commons Collections是通用的。
是否可以实现自己的Map覆盖put / get方法?
public class CaseInsensitiveMap extends HashMap {
...
put(String key, String value) {
super.put(key.toLowerCase(), value);
}
get(String key) {
super.get(key.toLowercase());
}
}
这种方法不会强迫您更改"键"类型,而是会更改Map实现。
这基本上是Apache Commons Collections CaseInsensitiveMap中采用的方法。
进行大写和小写操作时,请记住使用语言环境。
不要忘记重写所有其他" put"方法,例如putAll。
一个奇怪的副作用是,如果您在此地图中列出了按键,则它们会突然变成小写字母。
不喜欢扩展HashMap的想法,为什么不做这样的委托人:CaseInsensitiveMap ,它实现Map ,并且需要Map 作为构造函数参数?
如果将其内容转移到另一个地图中,请不要忘记containsKey和思维问题。
如果将齐射标记为可接受的答案,那就太好了。
当心在JDK8中执行此操作。实现已更改,您现在需要覆盖get,put和putAll,以使其保持一致。
请在此警告用户有关语言环境敏感的toLowercase()问题的危险!
您需要使用不区分大小写的equals()和hashCode()实现的String键包装类。使用它而不是字符串作为地图的键。
请参阅http://www.java.happycodings.com/Java_Util_Package/code3.html上的示例实现。我在谷歌搜索的2分钟后发现了它。对我来说似乎很明智,尽管我从未使用过它。
有点棘手,不是吗?如果不真正需要,我不喜欢实现equals和hashCode。我更喜欢创建Map实现而不是put和get方法的方法。
创建包装器类的过程一直都在进行,一点也不棘手。包装器类解决方案也比覆盖put,get,putAll更为整洁。您可以在任何基于散列或等号的集合(HashSet,HashMap,ArrayList等)上使用包装器类。
不同集合之间的可移植性很有趣。谢谢。我没有考虑过。我想每种方法都有其优点和缺点。
使用包装器类的另一个很好的理由是,如果您想保留字符串的原始大小写,则不可能通过覆盖put来做到这一点。
您可以使用此处讨论的我的Apache许可的CaseInsensitiveMap。与Apache Commons版本不同,它保留键的大小写。它比TreeMap更严格地实现地图协定(加上具有更好的并发语义)(有关详细信息,请参见博客评论)。
想到的三个显而易见的解决方案是:
在将字符串用作键之前,请对大小写进行规范化(土耳其语区域设置与世界其他地区的工作方式不同)。
使用设计为用作键的特殊对象类型。这是处理复合键的常见用法。
将TreeMap与不区分大小写的Comparator(可能是PRIMARY或SECONDARY强度的java.text.Collat??or)一起使用。不幸的是,Java库没有适用于hashCode / equals的Comparator等效项。
在下面的链接中查看接受的答案。
大小写如何检查地图中的键?
底线是"最简单的解决方案是在插入/检查之前将所有输入简单地转换为大写(或小写)。您甚至可以编写自己的Map包装器来确保一致性。"
Trove4j可以对HashMap使用自定义哈希。但是,由于无法缓存哈希码,因此这可能会对性能产生影响(尽管Trove4j可能已找到解决方法?)。包装对象(如John M所述)没有这种缓存不足。另请参阅有关TreeMap的其他答案。