有没有一个好的方法可以让 Mapget 和 put 忽略大小写?
有没有一种好方法可以让 Map
get 和 put 忽略大小写?
Is there a good way to have a Map<String, ?>
get and put ignoring case?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
TreeMap 扩展了 Map 并支持自定义比较器。
String 提供了默认的不区分大小写的比较器。
因此:
比较器不考虑区域设置。 在其 JavaDoc 中阅读更多相关信息。
TreeMap extends Map and supports custom comparators.
String provides a default case insensitive comparator.
So:
The comparator does not take locale into account. Read more about it in its JavaDoc.
您可以使用 CaseInsensitiveMap 来自 Apache 的 Commons Collections。
You could use CaseInsensitiveMap from Apache's Commons Collections.
是否可以实现您自己的 Map 重写 put/get 方法?
这种方法不会强迫您更改“键”类型,而是更改 Map 实现。
Would it be possible to implement your own Map overriding put/get methods ?
This approach does not force you to change your "key" type but your Map implementation.
您需要为 String 键提供一个包装类,并具有不区分大小写的 equals() 和 hashCode() 实现。 使用它而不是字符串作为地图的键。
请参阅 http://www.java.happycodings.com/Java_Util_Package/code3 的示例实现.html 我用 2 分钟的谷歌搜索找到了它。 对我来说看起来很明智,尽管我从未使用过它。
You need a wrapper class for your String key with a case-insensitive equals() and hashCode() implementation. Use that instead of the String for the Map's key.
See an example implementation at http://www.java.happycodings.com/Java_Util_Package/code3.html I found it in 2 minutes of googling. Looks sensible to me, though I've never used it.
我想到了三个明显的解决方案:
在使用字符串作为键之前标准化大小写(土耳其语言环境与世界其他地方的工作方式不同)。
在
使用设计用作键的特殊对象类型。 这是处理复合键的常见习惯用法。
使用带有不区分大小写的比较器的 TreeMap(可能是 PRIMARY 或 SECONDARY 强度 java.text.Collator)。 不幸的是,Java 库没有与 hashCode/equals 等效的比较器。
The three obvious solutions that spring to mind:
Normalise the case before using a String as a key (not Turkish locale works differently from the rest of the world).
Use a special object type designed to be used as key. This is a common idiom for dealing with composite keys.
Use a TreeMap with a Comparator that is case insensitive (possibly a PRIMARY or SECONDARY strength java.text.Collator). Unfortunately the Java library doesn't have a Comparator equivalent for hashCode/equals.
您可以使用我的 Apache 许可 CaseInsensitiveMap 讨论这里。 与 Apache Commons 版本不同,它保留键的大小写。 它比 TreeMap 更严格地实现了 Map 契约(并且具有更好的并发语义)(详细信息请参阅博客评论)。
You could use my Apache licensed CaseInsensitiveMap discussed here. Unlike the Apache Commons version, it preserves the case of keys. It implements the map contract more strictly than TreeMap (plus has better concurrent semantics) (see the blog comments for details).
Trove4j 可以对 HashMap 使用自定义哈希。 然而,鉴于哈希码无法缓存,这可能会对性能产生影响(尽管 Trove4j 可能已经找到了解决此问题的方法?)。 包装对象(如 John M 所描述)不存在这种缓存缺陷。 另请参阅我关于 TreeMap 的其他答案。
Trove4j can use custom hashing for a HashMap. This may however have performance implications given that hashcodes cannot be cached (although Trove4j may have found a way around this?). Wrapper objects (as described by John M) do not have this caching deficiency. Also see my other answer regarding TreeMap.
在下面的链接中检查已接受的答案。
如何检查映射中的密钥无论情况如何?
底线是“最简单的解决方案是在插入/检查之前将所有输入简单地转换为大写(或小写)。您甚至可以编写自己的 Map 包装器来执行此操作以确保一致性。”
Check the accepted answer at the link below.
How to check for key in a Map irrespective of the case?
Bottom line is "The simplest solution is to simply convert all inputs to uppercase (or lowercase) before inserting/checking. You could even write your own Map wrapper that would do this to ensure consistency."