package ruc.irm.similarity.sentence.editdistance;
import java.util.ArrayList;
import java.util.List;
import ruc.irm.similarity.sentence.SegmentProxy;
import ruc.irm.similarity.sentence.SegmentProxy.Word;
/**
* 超级字符串,可以存放指定的数据类型
*
* @author <a href="mailto:iamxiatian@gmail.com">夏天</a>
* @organization 中国人民大学信息资源管理学院 知识工程实验室
*
* @param <T>
*/
public class SuperString<T> {
private List<T> contents = new ArrayList<T>();
public SuperString(List<T> contents){
this.contents = contents;
}
public static SuperString<CharEditUnit> createCharSuperString(String str){
List<CharEditUnit> list = new ArrayList<CharEditUnit>(str.length());
for(int i=0; i<str.length(); i++){
list.add(new CharEditUnit(str.charAt(i)));
}
SuperString<CharEditUnit> s = new SuperString<CharEditUnit>(list);
return s;
}
public static SuperString<WordEditUnit> createWordSuperString(String sentence){
List<Word> wordList = SegmentProxy.segment(sentence);
List<WordEditUnit> unitList = new ArrayList<WordEditUnit>(wordList.size());
for(int i=0; i<wordList.size(); i++){
unitList.add(new WordEditUnit(wordList.get(i)));
}
SuperString<WordEditUnit> s = new SuperString<WordEditUnit>(unitList);
return s;
}
public T elementAt(int pos){
if(pos<0 || pos>=contents.size()){
throw new ArrayIndexOutOfBoundsException("下标越界");
}
return contents.get(pos);
}
public int indexOf(SuperString<?> substring){
int result = -1;
for(int i=0; i<length(); i++){
int j=0;
if(i+substring.length()>length()) return -1;
for(;j<substring.length();j++){
if(elementAt(i+j).equals(substring.elementAt(j))){
continue;
}else{
break;
}
}
if(j==substring.length()){
return i;
}
}
return result;
}
public SuperString<T> substring(int fromIndex, int toIndex){
return new SuperString<T>(contents.subList(fromIndex, toIndex));
}
public SuperString<T> substring(int fromIndex){
return new SuperString<T>(contents.subList(fromIndex, contents.size()));
}
public int length(){
return contents.size();
}
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i=0; i<length(); i++){
sb.append(elementAt(i));
}
return sb.toString();
}
@Override
public boolean equals(Object other){
return toString().equals(other.toString());
}
}