Вы знаете строго эквивалентную реализацию функции PHP similar_text в Java?PHP аналогичный_text() в java
ответ
Что касается Java, лучшим вариантом может быть StringUtils class из библиотеки Apache Commons Lang, которая содержит метод LevensteinDistance, который упоминаются в других сообщениях SO.
Таким образом, вы можете взять длину длинной строки и вычесть LevensteinDistance, чтобы получить тот же самый номер, который будет использоваться аналогичным_text. и для процентного результата вы разделите результат на длину. – lofte
- Скачать исходный код PHP (http://php.net/downloads.php)
- разархивации.
- Преобразование функции similar_text() в ext \ standard \ string.c в Java.
- Затем съесть мороженое для чая: D
ОК, поэтому я преобразовал C similar_text() в Java. У меня есть отношения любви/ненависти с C lol. Преобразование слегка взломанного кода указателя (очевидно, чтобы сделать его эффективным для PHP) для Java было непростым (для меня так или иначе). К сожалению, этот код не поместится здесь ... теперь только пункт 4), чтобы закончить :) – Mike
у вас есть этот код? – user1122069
Я думаю, вы посмотрите на этот пост может: PHP similar_text function in Javascript
Это Java-эквивалент для PHP similar_text. Вам нужно только адаптировать его в Java. извините, если это не поможет, так как я считаю, что синтаксис Javascript и Java имеют лишь небольшую разницу.
По крайней мере, вы знаете алгоритма реализация
Javascript и Java ** полностью ** разные – Marcelo
Вот моя реализация в 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;
}
разминка: http://stackoverflow.com/questions/907997/string-distance-library – miku
не точно. PHP аналогичный_текст отличается от расстояния levenshtein. Из справочника PHP аналогичного текста: «Это вычисляет сходство между двумя строками, как описано в Oliver [1993]. [...] Возвращает количество совпадающих символов в обеих строках». Я не могу найти реализацию Java для алгоритма подобия Oliver – Thomasleveil