您的用法稍微不正確。編碼的字符串和默認的最大編碼長度的快速調查表明,它是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」,它匹配‘板球’):
4
KRKT
KRKT
KRKT
解決方案:將最大碼長到適合您的應用程序和預期輸入的東西。例如:
meta.setMaxCodeLen(8);
System.out.println(meta.encode("cricket"));
System.out.println(meta.encode("criket"));
System.out.println(meta.encode("criketgame"));
現在輸出:
KRKT
KRKT
KRKTKM
現在你原來的測試給出了預期的結果:
Metaphone meta = new Metaphone();
meta.setMaxCodeLen(8);
System.out.println(meta.isMetaphoneEqual("cricket","criket"));
System.out.println(meta.isMetaphoneEqual("cricket","criketgame"));
印刷:
true
false
順便說一句, 你可以也想試驗DoubleMetaphone
,這是該算法的改進版本。
順便說一句,從the documentation注意警告關於線程安全:
的實例字段maxCodeLen
是可變的,但是不揮發,並訪問不同步。如果類的實例在線程之間共享,則調用者需要確保使用適當的同步來確保線程之間的值安全發佈,並且在初始設置後不得調用setMaxCodeLen(int)
。
我們在8年級時曾教過諺語「外表是騙人的」 – jaykio77 2014-11-24 14:39:53