没有任何运气找到这个,但我试图覆盖Java中的String func。我正在使用给定的源代码进行字典搜索,它是如何工作的,它基本上是哈希所有的单词。虽然如此,“HI”和“hi”不是同一个词。我认为最简单的方法是为String编写自己的哈希函数,以便“hi”然后在字典中哈希并显示“Hi”。我该怎么做?
答案 0 :(得分:4)
您创建一个具有单个字段的类,即String。
您的类上的@Override等于和hashCode做了不区分大小写的事情。
您可以将类的对象存储在HashSet或HashTable或其他任何内容中。
答案 1 :(得分:4)
与@ Oli相似,但无需拨打电话之前的案例
public class CaseInsensitiveMap<V> implements Map<String, V> {
private final Map<String, V> map;
public CaseInsensitiveMap(Map<String, V> map) {
this.map = map;
}
public V put(String key, V value) {
return map.put(key.toLowerCase(), value);
}
/// etc...
}
答案 2 :(得分:2)
在运行哈希函数之前调用String.toUpperCase()
?
答案 3 :(得分:1)
这个想法有三个缺点:它是坏的,不可能的和不必要的。
这是不可能的,因为java.lang.String是最终的。你不能从它继承,所以你不能覆盖任何方法。
这有两个方面的不好:首先是因为你会改变其中一个核心类的合同和行为。能够传递一个不像String那样的String实例可能会破坏任何东西。其次,我明白要做你想做的事你也必须重写等于 - 这将以非对称等于(其中a.equals(b)!= b.equals(a)以防a或者其中之一b是一个普通的字符串,一个是你的特殊版本)。我认为不区分大小写的字符串等于普通字符串实际上是布洛赫“有效Java”中一个非常糟糕的想法的例子。
这是不必要的,因为你需要的是一个持有String并委托给它的对象。它也可以有一个构造函数或一个采用普通字符串的静态工厂方法。或者不区分大小写的地图。其他答案中有很多例子。