【发布时间】:2010-09-17 20:48:21
【问题描述】:
对于TreeMap,提供自定义Comparator 是微不足道的,从而覆盖添加到地图的Comparable 对象提供的语义。 HashMaps 但是不能以这种方式控制;提供散列值和相等性检查的函数不能被“侧载”。
我怀疑设计一个界面并将其改造成HashMap(或一个新类)既简单又有用?像这样的东西,除了更好的名字:
interface Hasharator<T> {
int alternativeHashCode(T t);
boolean alternativeEquals(T t1, T t2);
}
class HasharatorMap<K, V> {
HasharatorMap(Hasharator<? super K> hasharator) { ... }
}
class HasharatorSet<T> {
HasharatorSet(Hasharator<? super T> hasharator) { ... }
}
case insensitive Map 问题得到了一个简单的解决方案:
new HasharatorMap(String.CASE_INSENSITIVE_EQUALITY);
这是否可行,或者您是否发现这种方法存在任何基本问题?
是否在任何现有(非 JRE)库中使用了该方法? (试过谷歌,没有运气。)
编辑:hazzen 提出了很好的解决方法,但恐怕这是我试图避免的解决方法...... ;)
编辑:将标题更改为不再提及“比较器”;我怀疑这有点令人困惑。
编辑:接受与性能相关的答案;希望得到更具体的答案!
编辑:有一个实现;请参阅下面接受的答案。
编辑:改写第一句以更清楚地表明这是我所追求的侧载(而不是排序;排序不属于 HashMap)。
【问题讨论】:
-
"这个类不保证地图的顺序;特别是,它不保证顺序会随着时间的推移保持不变。" -- HashMap 的 Javadocs。换句话说,HashMap 是无序的。
-
此语句允许使用任何 hashCode 实现,还允许 Map 随时调整自身大小。所以在这种情况下这是一个特性而不是一个问题?
标签: java collections hashmap trove4j