2011-06-20 113 views
2

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

+0

重写String hashCode()将不会受益,除非您也覆盖equals()。改变两者都有可能破坏任何使用String的代码(这是大部分的JDK) –

回答

4

您使用单个字段(字符串)创建类。

你@Override equals和hashCode在你的类上做不区分大小写的东西。

您将类的对象存储在HashSet或HashTable中或其他类中。

+0

这将涉及很多代码重写示例写入的方式。有没有办法只为程序单独使用字符串funcs? – Jdban101

+0

如果您首先重构代码以删除与使用地图有关的所有重复内容,那么执行此操作只需要更改大约三行代码:创建地图,在地图中放置东西,从地图中取出东西。 –

2

在运行散列函数之前调用String.toUpperCase()

+0

它的工作方式是,它看到它们是相等的,然后从字典定义的哈希表中获取字符串。因此,如果我使用String.toUpperCase来使哈希和所有内容相等,我最终会把所有的单词都写成大写 – Jdban101

+0

@ Jdban101 - 如果你希望在你的哈希中不区分大小写,那么你必须有多个大小写。你想要哪一个?他们全部? – dfb

+0

@spinning_plate我希望我的散列在同一个地方搜索“hi”和“HI”,这样他们就可以从数据库中取出“Hi”这个词。这些情况并不是一成不变的,诸如“DSL”之类的字词就在词典中,正如“T1 Cable”这样的词 – Jdban101

4

类似@奥利的,但不必调用

之前打电话......案例
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... 
} 
+0

这是错误的。在Locale.setDefault(新Locale(“tr”))后尝试“HI”。搜索“臭名昭着的土耳其语区域错误”。 –

+0

@bkail我认为它已经为拉丁字母设计。如果你将locale设置为'tr',那么yes和hı是不区分大小写的相同的东西,它仍然有效。问题在哪里? –

+0

put(“HI”,...)是否得到(“hi”)取决于语言环境。一种修复方法是toLowerCase(Locale.ENGLISH)。 –

1

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

这是不可能的,因为java.lang.String是最终的。你不能从它继承,所以你不能覆盖任何方法。

从两方面来看,这很糟糕:首先是因为你会改变其中一个核心类的契约和行为。能够传递一个不像String的行为实例可以从字面上打破任何事情。其次,我明白要做你想做的事情,你也必须重写equals,并且这将以一个不对称的等式结束(其中a.equals(b)!= b.equals(a) b是一个简单的字符串和一个你的特殊版本)。我认为不区分大小写的字符串等于普通字符串,实际上是Bloch的“Effective Java”中一个非常糟糕的主意的例子。

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

+0

不是不可能的。您可以使用Xbootclasspath提供您自己的String类版本。如果代码不在安全的环境中运行(即JNLP),您甚至可以使用它来重新编写散列函数,因为它需要OP。然而,这是非常糟糕的做法,我同意,完全没有必要。 – hoipolloi

+0

@hoipolloi - “不可能”在“不可能从外部访问私有属性”。精度太高会导致答案失效:-) – fdreger

+0

“无法从课外访问私人属性” - 正确吗? http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/AccessibleObject.html - > setAccessible ...只是在开玩笑,我知道你的意思。 :) – hoipolloi