Знаете ли вы какую-либо строго эквивалентную реализацию PHP аналогичной функции в Java?
Вот моя реализация в 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 ; } }
это работает так же, как и функция 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; }
Что касается Java, лучшим вариантом может быть класс StringUtils из библиотеки Apache Commons Lang , который содержит метод LevensteinDistance , который упоминаются в других сообщениях SO.
Я думаю, вы можете взглянуть на это сообщение: PHP аналогичная функция в Javascript
Это эквивалент javascript для PHP аналогичного_текста. Вам нужно только адаптировать его в Java. извините, если это не поможет, так как я считаю, что синтаксис Javascript и Java имеют лишь небольшую разницу.
По крайней мере, вы знаете алгоритм реализации