是否有一个良好的方式有一个地图<String, ?=""> 获得和放忽视的情况下?[重复]
-
03-07-2019 - |
题
这个问题已经有一个答案在这里:
- 情况不敏感的串为哈希键 12的答案
是否有一个良好的方式有一个 Map<String, ?>
获得和放忽视的情况下?
解决方案
树形图延伸的地图,并支持定义的比较。
串提供默认的情况不敏感的比较。
所以:
final Map<String, ...> map = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
比较没有把区域考虑在内。了解更多关于它在如果是的话,为什么不试.
其他提示
你可以用 CaseInsensitiveMap 从阿帕奇的公共收藏品。
才有可能实现自己的地图复盖把/获得的方法吗?
public class CaseInsensitiveMap extends HashMap<String, String> {
...
put(String key, String value) {
super.put(key.toLowerCase(), value);
}
get(String key) {
super.get(key.toLowercase());
}
}
这种方法不能强迫你去改变你的"钥匙"一类型但是,你的地图的执行。
你需要一个包装类为你的串钥匙有一种情况不敏感的平等()和哈希码()实施。使用,而不是串的地图的关键。
见例的执行情况 http://www.java.happycodings.com/Java_Util_Package/code3.html 我发现它在2分钟内的搜索.看起来很明智我说,虽然我从来没有使用过它。
三个明显的解决方案,想到:
正常化的情况下使用前一个字符串的一个关键(不土耳其区域以不同的方式工作,从世界其他地).
使用特殊类型的对象设计用来作为关键。这是一个常见的成语,用于处理复合的钥匙。
用树形图一比较,情况不敏感的(可能是一个主要或次要强java。的文本。整理器).不幸的是Java库没有一个比较相当于哈希码/平等的。
你可以用我的Apache许可 CaseInsensitiveMap 讨论的 在这里,.不像Apache共同的版本,它保留的情况下钥匙。它实现了地图的合同更严格地比树形图(加上有更好的并行义)(参看博客的评论详情)。
Trove4j 可以使用定制的散列为哈希.这可能但是有影响性能鉴于hashcodes不能缓存(尽管Trove4j可能已经找到办法解决这个?).包装的物体(如约翰*M)没有这种高速缓存的缺乏。还看到我的其他答复关于树形图.
检查所接受的答案在下面的链接。如何检查关键地图中无论何种情况下?
底线是"最简单的解决方案是简单地转换的所有投入大写字母(或小写)之前插入/检查。你甚至可以写你自己的地图包装,将这样做,以确保一致性。"