2017-05-09 5 views
-1

Je travaille sur une implémentation d'un algorithme de plagiat de code source (algorithme de vannage) et j'ai un problème où j'ai besoin d'aide.Suivre la position originale de la chaîne transformée en Java

Exemple: J'ai une chaîne

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

et transformer cette chaîne à

test="blahelloblatestblablablayeahbla" 

et de cette chaîne, je construis kgrams par exemple 5 grammes

blahe lahel ahell hello ellob llobl .... ahbla 

I enregistrer les kgrams dans une liste de chaînes mais aussi sauvegarder les positions de départ et de fin du texte original de chaque kramme, de sorte que je puisse à la fin renvoyer chaque kgram à sa position originale.

EDIT:

Ma question serait de savoir comment puis-je obtenir la position de départ et à la fin d'un kgram Quelqu'un peut-il me aider? Avez-vous une idée? Merci d'avance.

+0

Voulez-vous dire quelque chose comme ça? blahe.begin = 0, blahe.end = 4, lahel.begin = 1, lahel.begin = 5, ...? – wimdetr

+0

Définissez une classe NGram avec toutes les propriétés dont vous avez besoin (par exemple, n, valeur, beginIndex, endIndex, etc.). Alors vos n-grammes sont des instances de NGram plutôt que des instances de String et vous pouvez transporter toutes les méta-données supplémentaires que vous pourriez trouver utiles. – Rob

+0

Oh désolé ma question était trompeuse. Je l'ai édité. Je peux l'enregistrer dans une classe mais comment puis-je obtenir la position de début et de fin d'un kgram. J'ai transformé le texte original et beaucoup de caractères sont remplacés. Par exemple, je veux obtenir pour le karram ellob start pos: 4 et la position de fin 13 – vizero

Répondre

0

Si vous voulez les positions de la chaîne d'origine, vous ne pouvez pas supprimer les non-lettres en premier ou les informations sont perdues. Vous devrez soit trouver les kgrams dans la chaîne d'origine directement (plus de temps CPU) ou stocker la position d'origine de chaque lettre avec la chaîne modifiée (plus d'espace mémoire).

est ici une mise en œuvre de ce dernier:

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; 
    } 
} 

Exemple:

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

Oh désolé ma question était trompeuse. Je l'ai édité. Je peux l'enregistrer dans une classe mais comment puis-je obtenir la position de début et de fin d'un kgram. J'ai transformé le texte original et beaucoup de caractères sont remplacés. Par exemple je veux obtenir pour le karram ellob start pos: 4 et la position de fin 13 – vizero

+0

Je vois ce que vous voulez dire maintenant, j'ai mis à jour la réponse. –