1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| import java.util.ArrayList;
import java.util.*;
/**
* @author duj
*/
public class Tokenizer {
public static void main(String[] args) {
String s= "AB123A456AB789CAB";
String pattern= "AB";
System.out.println(tokenize(s, pattern));
s= "AB123ABC456AB789CAB";
pattern= "ABC";
System.out.println(tokenize(s, pattern));
s= "AB123ABC456AB789CABC";
pattern= "ABC";
System.out.println(tokenize(s, pattern));
}
/**
* But: tokenize str selon pattern
* pre: str != null && pattern != null
*/
public static List tokenize(String str, String pattern) {
return tokenize(str.toCharArray(), pattern.toCharArray());
}
/**
* But: tokenize tab selon un pattern p
* @pre:tab != null && p != null
* @post: return List l qui contient les sous-chaines l[1]...l[n] de tab tel que:
* pour tout t app à l : t ne contient pas p et t.length>0
* tab == p? l[0] p l[1] p ..... l[n] p?
*/
private static List tokenize(char[] tab, char[] p) {
List l= new ArrayList();
int i= 0;
int j= 0;
int k= 0;
/*pre: l.length==0 && i==0 && j==0 && k==0
*post : i==tab.length && la post de tokenize
*/
/*
*INV: 1. 0<=j+k<=tab.length
* 2. 0<=i<=j
* 3. 0<=k<=p.length
* 2. tab[i-p.length i[==p[0 p.length[
* 4. l contient les sous-chaines l[1]...l[n] de tab[0 i[ tel que:
* pour tout t app à l : t ne contient pas p et t.length>0
* tab == p? l[0] p l[1] p ..... l[n] p?
*/
while (j + k != tab.length) {
if (k == p.length) {
if (i != j) {
l.add(substring(tab, i, j));
}
j= j + k;
k= 0;
i= j;
} else if (tab[j + k] == p[k]) {
k++;
} else {
k= 0;
j++;
}
}
if (i != j) {
if (k == p.length) {
l.add(substring(tab, i, j));
} else {
l.add(substring(tab, i, j + k));
}
}
return l;
}
/**
* @pre:tab!=null
* 0<=i<=i<=tab.lenght
* @post:
* return un string representant tab[i j[
*/
private static String substring(char[] tab, int i, int j) {
int length= j - i;
char[] str= new char[length];
arrayCopy(tab, str, i, length);
return new String(str);
}
/**
* @pre: src !=null src est un array dest != null dest est un array
* @post: dest[0:length[=src[i:i+length[
*/
private static void arrayCopy(Object src, Object dest, int i, int length) {
System.arraycopy(src, i, dest, 0, length);
}
} |
Partager