没有任何运气发现这一点,但我试图重写Java中的字符串函数。我正在使用给定的源代码进行字典搜索,它如何工作基本上是散列所有单词。它虽然这样做,“HI”和“嗨”不是同一个词。我想最简单的方法是编写我自己的字符串散列函数,以便“hi”然后在字典中散列并显示“Hi”。我该怎么做呢?覆盖Java中的字符串哈希函数
回答
您使用单个字段(字符串)创建类。
你@Override equals和hashCode在你的类上做不区分大小写的东西。
您将类的对象存储在HashSet或HashTable中或其他类中。
这将涉及很多代码重写示例写入的方式。有没有办法只为程序单独使用字符串funcs? – Jdban101
如果您首先重构代码以删除与使用地图有关的所有重复内容,那么执行此操作只需要更改大约三行代码:创建地图,在地图中放置东西,从地图中取出东西。 –
在运行散列函数之前调用String.toUpperCase()
?
类似@奥利的,但不必调用
之前打电话......案例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...
}
这是错误的。在Locale.setDefault(新Locale(“tr”))后尝试“HI”。搜索“臭名昭着的土耳其语区域错误”。 –
@bkail我认为它已经为拉丁字母设计。如果你将locale设置为'tr',那么yes和hı是不区分大小写的相同的东西,它仍然有效。问题在哪里? –
put(“HI”,...)是否得到(“hi”)取决于语言环境。一种修复方法是toLowerCase(Locale.ENGLISH)。 –
的想法有三个缺点:它是坏的,不可能也没有必要。
这是不可能的,因为java.lang.String是最终的。你不能从它继承,所以你不能覆盖任何方法。
从两方面来看,这很糟糕:首先是因为你会改变其中一个核心类的契约和行为。能够传递一个不像String的行为实例可以从字面上打破任何事情。其次,我明白要做你想做的事情,你也必须重写equals,并且这将以一个不对称的等式结束(其中a.equals(b)!= b.equals(a) b是一个简单的字符串和一个你的特殊版本)。我认为不区分大小写的字符串等于普通字符串,实际上是Bloch的“Effective Java”中一个非常糟糕的主意的例子。
这是没有必要的,因为你需要的是一个持有一个字符串并委托给它的对象。它也可以有一个构造函数或一个静态工厂方法,它接受一个纯字符串。或者不区分大小写的地图。其他答案中有很多例子。
不是不可能的。您可以使用Xbootclasspath提供您自己的String类版本。如果代码不在安全的环境中运行(即JNLP),您甚至可以使用它来重新编写散列函数,因为它需要OP。然而,这是非常糟糕的做法,我同意,完全没有必要。 – hoipolloi
@hoipolloi - “不可能”在“不可能从外部访问私有属性”。精度太高会导致答案失效:-) – fdreger
“无法从课外访问私人属性” - 正确吗? http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/AccessibleObject.html - > setAccessible ...只是在开玩笑,我知道你的意思。 :) – hoipolloi
- 1. Python3哈希函数覆盖
- 2. 覆盖哈希
- 3. java中的哈希表覆盖问题
- 4. 覆盖JSON哈希
- 5. Java:本地哈希表覆盖全局哈希表
- 6. 哈希字符串
- 7. 600M语句的Java哈希字符串
- 8. Java哈希函数
- 9. 哈希值覆盖值
- 10. 内部哈希表覆盖
- 11. 基本字符串哈希/去哈希
- 12. 如何覆盖Java中的字符串?
- 13. Java JDBC/SQLite:任何内置哈希字符串函数
- 14. 低熵字母数字字符串的高效哈希函数
- 15. Java:字符串到7位哈希
- 16. 字符串到哈希中的符号
- 17. 适当的哈希函数哈希随机二进制字符串
- 18. 字符串在Java哈希表中出现的次数
- 19. Java:覆盖受保护的字符串
- 20. 哈希名字符串
- 21. 哈希字符串大小
- 22. 字符串哈希转换
- 23. Java中的哈希数组哈希
- 24. java哈希函数冲突
- 25. Java函数覆盖
- 26. 使用mb_string函数覆盖PHP的默认字符串函数
- 27. 从红宝石字符串中写入JavaScript函数哈希
- 28. 哈希集覆盖的方法
- 29. Python中的哈希(隐藏)字符串
- 30. 字符串中的Perl哈希对值
重写String hashCode()将不会受益,除非您也覆盖equals()。改变两者都有可能破坏任何使用String的代码(这是大部分的JDK) –