Отслеживать исходное положение преобразованной строки в 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]
Другие вопросы по тегам