2010-01-04 5 views
1

Вы знаете строго эквивалентную реализацию функции PHP similar_text в Java?PHP аналогичный_text() в java

+0

разминка: http://stackoverflow.com/questions/907997/string-distance-library – miku

+0

не точно. PHP аналогичный_текст отличается от расстояния levenshtein. Из справочника PHP аналогичного текста: «Это вычисляет сходство между двумя строками, как описано в Oliver [1993]. [...] Возвращает количество совпадающих символов в обеих строках». Я не могу найти реализацию Java для алгоритма подобия Oliver – Thomasleveil

ответ

0

Что касается Java, лучшим вариантом может быть StringUtils class из библиотеки Apache Commons Lang, которая содержит метод LevensteinDistance, который упоминаются в других сообщениях SO.

+0

Таким образом, вы можете взять длину длинной строки и вычесть LevensteinDistance, чтобы получить тот же самый номер, который будет использоваться аналогичным_text. и для процентного результата вы разделите результат на длину. – lofte

0
  1. Скачать исходный код PHP (http://php.net/downloads.php)
  2. разархивации.
  3. Преобразование функции similar_text() в ext \ standard \ string.c в Java.
  4. Затем съесть мороженое для чая: D
+0

ОК, поэтому я преобразовал C similar_text() в Java. У меня есть отношения любви/ненависти с C lol. Преобразование слегка взломанного кода указателя (очевидно, чтобы сделать его эффективным для PHP) для Java было непростым (для меня так или иначе). К сожалению, этот код не поместится здесь ... теперь только пункт 4), чтобы закончить :) – Mike

+0

у вас есть этот код? – user1122069

-1

Я думаю, вы посмотрите на этот пост может: PHP similar_text function in Javascript

Это Java-эквивалент для PHP similar_text. Вам нужно только адаптировать его в Java. извините, если это не поможет, так как я считаю, что синтаксис Javascript и Java имеют лишь небольшую разницу.

По крайней мере, вы знаете алгоритма реализация

+1

Javascript и Java ** полностью ** разные – Marcelo

1

Вот моя реализация в Java:

package comwebndesignserver.server; 

import android.util.Log; 

/* 
* 
* DenPashkov 2012 
* http://www.facebook.com/pashkovdenis 
* * PhP Similar String Implementation 
* 30.07.2012 
* 
*/ 

public class SimilarString { 

    private String string = "" ; 
    private String string2 = ""; 
    public int procent = 0 ; 
    private int position1 =0 ; 
    private int position2 =0; 

    // Similar String 
    public SimilarString(String str1, String str2){ 
     this.string = str1.toLowerCase(); 
     this.string2 = str2.toLowerCase(); 
    } 
    public SimilarString() { 

    } 
    // Set string 
    public SimilarString setString(String str1, String str2){ 
     this.string = str1.toLowerCase(); 
     this.string2 = str2.toLowerCase(); 
     return this ; 
    } 

//get Similar 
    public int similar(){ 
     string= string.trim() ; 
     string2= string2.trim(); 
    int len_str1 = string.length() ; 
     int len_str2 = string2.length() ; 

     int max= 0; 
     if (string.length()>1 && string2.length()>1){ 
      // iterate 
      for (int p=0 ; p<=len_str1; p++){ 
       for (int q=0 ; q<=len_str2; q++){ 
        for(int l=0 ; (p + l < len_str1) && (q + l < len_str2) && (string.charAt(l) == string2.charAt(l)); l++){ 
         if (l>max){ 
          max=l ; 
          position1 = p ; 
          position2 = q; 
         } 
        } 
       } 
      } 

     //sim * 200.0/(t1_len + t2_len) 
     this.procent = max * 200/((string.length()) + (string2.length()) - (max) + (position2 - position1) ) - (max*string.length()) ; 
     if (procent>100) procent = 100; 
     if (procent<0) procent = 0; 
     } 
     return this.procent ; 
    } 
} 
1

это работает так же, как функция PHP similar_text как в php_similar_str, php_similar_char, PHP_FUNCTION (similar_text) в string.c файл источников PHP

private float similarText(String first, String second) { 
    first = first.toLowerCase(); 
    second = second.toLowerCase(); 
    return (float)(this.similar(first, second)*200)/(first.length()+second.length()); 
} 

private int similar(String first, String second) { 
    int p, q, l, sum; 
    int pos1=0; 
    int pos2=0; 
    int max=0; 
    char[] arr1 = first.toCharArray(); 
    char[] arr2 = second.toCharArray(); 
    int firstLength = arr1.length; 
    int secondLength = arr2.length; 

    for (p = 0; p < firstLength; p++) { 
     for (q = 0; q < secondLength; q++) { 
      for (l = 0; (p + l < firstLength) && (q + l < secondLength) && (arr1[p+l] == arr2[q+l]); l++);    
      if (l > max) { 
       max = l; 
       pos1 = p; 
       pos2 = q; 
      } 

     } 
    } 
    sum = max; 
    if (sum > 0) { 
     if (pos1 > 0 && pos2 > 0) { 
      sum += this.similar(first.substring(0, pos1>firstLength ? firstLength : pos1), second.substring(0, pos2>secondLength ? secondLength : pos2)); 
     } 

     if ((pos1 + max < firstLength) && (pos2 + max < secondLength)) { 
      sum += this.similar(first.substring(pos1 + max, firstLength), second.substring(pos2 + max, secondLength)); 
     } 
    }  
    return sum; 
}