繁体   English   中英

在Java中覆盖String哈希函数

[英]Override String hash function in Java

没有任何运气找到这个,但我试图覆盖Java中的String func。 我正在使用给定的源代码进行字典搜索,它是如何工作的,它基本上是哈希所有的单词。 虽然如此,“HI”和“hi”不是同一个词。 我认为最简单的方法是为String编写自己的哈希函数,以便“hi”然后在字典中哈希并显示“Hi”。 我该怎么做呢?

您创建一个具有单个字段的类,即String。

您在类上使用@Override equals和hashCode来执行不区分大小写的操作。

您可以将类的对象存储在HashSet或HashTable中。

与@ 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...
}  

在运行哈希函数之前调用String.toUpperCase()

这个想法有三个缺点:它是坏的,不可能的和不必要的。

这是不可能的,因为java.lang.String是最终的。 您无法继承它,因此您无法覆盖任何方法。

它在两个方面很糟糕:首先是因为你会改变其中一个核心类的合同和行为。 能够传递一个不像String那样的String实例可能会破坏任何东西。 其次,我明白要做你想做的事你也必须重写等于 - 这将以非对称等于(其中a.equals(b)!= b.equals(a)以防a或者其中之一b是一个普通的字符串,一个是你的特殊版本)。 我认为不区分大小写的字符串等于普通字符串实际上是Bloch的“Effective Java”中一个非常糟糕的想法的例子。

这是不必要的,因为你需要的是一个持有String并委托给它的对象。 它也可以有一个构造函数或一个采用普通字符串的静态工厂方法。 或者不区分大小写的地图。 其他答案中有很多例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM