是否有一个良好的方式有一个地图<String, ?=""> 获得和放忽视的情况下?[重复]

StackOverflow https://stackoverflow.com/questions/212562

  •  03-07-2019
  •  | 
  •  

这个问题已经有一个答案在这里:

是否有一个良好的方式有一个 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)没有这种高速缓存的缺乏。还看到我的其他答复关于树形图.

检查所接受的答案在下面的链接。如何检查关键地图中无论何种情况下?

底线是"最简单的解决方案是简单地转换的所有投入大写字母(或小写)之前插入/检查。你甚至可以写你自己的地图包装,将这样做,以确保一致性。"

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top