2014-11-23 4 views
1

Java에서 다른 단어에 음성 표기를 사용하고 있습니다. 나는 Soundex를 사용했으나 너무 조잡했다. 나는 Metaphone으로 전환하고 더 나은 것을 깨달았다. 그러나, 나는 그것을 엄격하게 테스트했을 때. 이상한 행동을 발견 했어. 나는 그것이 메타 폰이 작동하는 방식인지 아니면 잘못된 방식으로 사용하고 있는지를 물어야했다. 고급의 작품을 예를 다음에서 : -Metaphone 알고리즘에서 예기치 않은 결과가 발생했습니다.

Metaphone meta = new Metaphone(); 
if (meta.isMetaphoneEqual("cricket","criket")) System.out.prinlnt("Match 1"); 
if (meta.isMetaphoneEqual("cricket","criketgame")) System.out.prinlnt("Match 2"); 

이것은

Match 1 
    Mathc 2 

지금 "크리켓" "criket"하지만 어떻게 온 "크리켓"같은 소리와 "criketgame"않습니다 인쇄 것 같다. 어떤 사람이 이것을 설명한다면. 큰 도움이 될 것입니다.

답변

1

사용법이 약간 잘못되었습니다. "을"KRKTKM "에서 잘립니다 ("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 "의 끝을 절단하는 4 보여줍니다) "크리켓"일치 "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 

이제 원래의 테스트가 제공하는 예상 결과 : 여담으로

 
true 
false 

:

Metaphone meta = new Metaphone(); 
meta.setMaxCodeLen(8); 
System.out.println(meta.isMetaphoneEqual("cricket","criket")); 
System.out.println(meta.isMetaphoneEqual("cricket","criketgame")); 

인쇄 , 당신은 할 수있다 또한 알고리즘의 개선 된 버전 인 DoubleMetaphone으로 실험하고 싶습니다. 그런데


는 스레드 안전에 관한 the documentation에서주의해야 할 점에 유의하십시오

인스턴스 필드 maxCodeLen는 변경할 수 있지만 휘발성이 아니며, 액세스가 동기화되지 않습니다. 클래스 인스턴스가 스레드간에 공유되는 경우 호출자는 스레드간에 값을 안전하게 게시하기 위해 적절한 동기화가 사용되는지 확인해야하며 초기 설정 후에 setMaxCodeLen(int)을 호출하면 안됩니다.

+0

우리는 속담을 가르쳤다. "외모는 사기성이있다" – jaykio77

관련 문제