你的用法有点不正确。对编码字符串和默认最大代码长度的快速调查表明它是 4,这会截断较长的“criketgame”的结尾:
System.out.println(meta.getMaxCodeLen());
System.out.println(meta.encode("cricket"));
System.out.println(meta.encode("criket"));
System.out.println(meta.encode("criketgame"));
输出(注意“criketgame”从“KRKTKM”截断为“KRKT”,与“cricket”匹配):
4
韩国电信
韩国电信
韩国电信
解决方案:将最大代码长度设置为适合您的应用程序和预期输入的值。例如:
meta.setMaxCodeLen(8);
System.out.println(meta.encode("cricket"));
System.out.println(meta.encode("criket"));
System.out.println(meta.encode("criketgame"));
现在输出:
韩国电信
韩国电信
KRKTKM
现在您的原始测试给出了预期的结果:
Metaphone meta = new Metaphone();
meta.setMaxCodeLen(8);
System.out.println(meta.isMetaphoneEqual("cricket","criket"));
System.out.println(meta.isMetaphoneEqual("cricket","criketgame"));
印刷:
真的
错误的
顺便说一句,您可能还想尝试一下DoubleMetaphone
,这是算法的改进版本。
顺便说一句,请注意文档中有关线程安全的警告:
实例字段maxCodeLen
是可变的但不是易失的,并且访问不同步。如果类的实例在线程之间共享,则调用者需要确保使用适当的同步来确保线程之间值的安全发布,并且不得setMaxCodeLen(int)
在初始设置后调用。