Отслеживать исходное положение преобразованной строки в Java
Я работаю над реализацией алгоритма плагиата исходного кода (алгоритм веяния) и у меня возникла проблема, когда мне нужна помощь.
Пример: у меня есть строка
String test="blahello,,,,/blatestbla7234///§"§$%"%$\n\n23344)§()(§$blablayeahbla";
и преобразовать эту строку в
test="blahelloblatestblablablayeahbla"
и из этой строки я строю килограммы, например, 5 граммов
blahe lahel ahell hello ellob llobl .... ahbla
Я сохраняю килограммы в списке строк, но также хотел бы сохранить начальную и конечную позиции из исходного текста каждой килограммы, чтобы я мог ссылаться в конце каждой килограммы на исходную текстовую позицию.
РЕДАКТИРОВАТЬ:
Поэтому мой вопрос будет таким: как я могу получить начальную и конечную позиции kgram? Может кто-нибудь помочь мне там? Есть ли у вас какие-либо идеи? Заранее спасибо.
1 ответ
Если вам нужны позиции из исходной строки, вы не можете сначала удалить не-буквы, или информация потеряна. Вам нужно будет либо найти килограммы в исходной строке напрямую (больше времени ЦП), либо сохранить исходную позицию каждой буквы вместе с измененной строкой (больше места в памяти).
Вот реализация последнего:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class KGram {
public final String str;
public final int start;
public final int end;
public KGram(String str, int start, int end) {
this.str = str;
this.start = start;
this.end = end;
}
@Override
public String toString() {
return "KGram[\"" + str + "\":" + start + "," + end + "]";
}
public static List<KGram> extractFrom(String input, int size) {
char[] chars = new char[input.length()];
int[] indexes = new int[input.length()];
int len = 0;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (!Character.isLetter(c)) continue;
chars[len] = c;
indexes[len] = i;
len++;
}
List<KGram> kgrams = new ArrayList<>();
for (int i = 0, j = size - 1; j < len; i++, j++) {
String str = new String(Arrays.copyOfRange(chars, i, j + 1));
kgrams.add(new KGram(str, indexes[i], indexes[j]));
}
return kgrams;
}
}
Пример:
String test = "blahello,,,,/blatestbla7234///§\"§$%\"%$\n\n23344)§()(§$blablayeahbla";
List<KGram> kgrams = KGram.extractFrom(test, 5);
System.out.println(kgrams.get(4)); // prints KGram["ellob":4,13]
System.out.println(kgrams.get(26)); // prints KGram["ahbla":60,64]