2017-05-09 22 views
-1

我正在研究源代碼剽竊算法(風選算法)的實現,並遇到需要一些幫助的問題。在java中跟蹤轉換後的字符串的原始位置

實施例: 我有一個字符串

String test="blahello,,,,/blatestbla7234///§"§$%"%$\n\n23344)§()(§$blablayeahbla"; 

和變換這個字符串

test="blahelloblatestblablablayeahbla" 

和從該字符串我建立例如5-克

blahe lahel ahell hello ellob llobl .... ahbla 

我kgrams將kgram保存在一個字符串列表中,但也想保存開始和結束位置fr om每個kgram的原始文本,所以我可以在最後引用每個kgram回到它們的原始文本位置。

編輯:

所以我的問題是我怎麼能得到一個的kgram 誰能幫我那裏的開始和結束位置?你有什麼主意嗎? 在此先感謝。

+0

你的意思是這樣的? blahe.begin = 0,blahe.end = 4,lahel.begin = 1,lahel.begin = 5,...? – wimdetr

+0

用你需要的任何屬性定義一個NGram類(例如,n,value,beginIndex,endIndex等)。那麼你的n-gram是NGram的實例,而不是String的實例,你可以攜帶任何你可能會覺得有用的元數據。 – Rob

+0

哦,對不起,我的問題是誤導。我編輯過它。 我可以將它保存在一個類中,但是如何獲取kgram的開始和結束位置。我轉換了原文,並且更換了很多字符。 例如,我想要獲得kgram ellob start pos:4和結束位置13 – vizero

回答

0

如果您想要原始字符串的位置,您不能先刪除非字母或信息丟失。您需要直接在原始字符串中找到kgram(更多CPU時間),或者將每個字母的原始位置與修改的字符串(更多的內存空間)一起存儲。

這裏是後者的實現:

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] 
+0

哦,對不起,我的問題是誤導。我編輯過它。 我可以將它保存在一個類中,但是如何獲取kgram的開始和結束位置。我轉換了原文,並且更換了很多字符。 例如我想獲得kgram ellob start pos:4和end position 13 – vizero

+0

我明白你的意思了,我更新了答案。 –