package org.ansj.splitWord.impl;
import org.ansj.domain.AnsjItem;
import org.ansj.library.DATDictionary;
import org.ansj.splitWord.GetWords;
public class GetWordsImpl implements GetWords {
/**
* offe : 当前词的偏移量
*/
public int offe;
/**
* 构造方法,同时加载词典,传入词语相当于同时调用了setStr() ;
*/
public GetWordsImpl(String str) {
setStr(str);
}
/**
* 构造方法,同时加载词典
*/
public GetWordsImpl() {
}
int charsLength = 0;
@Override
public void setStr(String str) {
setChars(str.toCharArray(), 0, str.length());
}
@Override
public void setChars(char[] chars, int start, int end) {
this.chars = chars;
i = start;
this.start = start;
charsLength = end;
checkValue = 0;
}
public char[] chars;
private int charHashCode;
private int start = 0;
public int end = 0;
private int baseValue = 0;
private int checkValue = 0;
private int tempBaseValue = 0;
public int i = 0;
private String str = null;
@Override
public String allWords() {
for (; i < charsLength; i++) {
charHashCode = chars[i];
end++;
switch (getStatement()) {
case 0:
if (baseValue == chars[i]) {
str = String.valueOf(chars[i]);
offe = i;
start = ++i;
end = 0;
baseValue = 0;
tempBaseValue = baseValue;
return str;
} else {
int startCharStatus = DATDictionary.getItem(chars[start]).getStatus();
if (startCharStatus == 1) { //如果start的词的status为1,则将start设为i;否则start加1
start=i;
i--;
end = 0;
baseValue = 0;
} else {
i = start;
start++;
end = 0;
baseValue = 0;
}
break;
}
case 2:
i++;
offe = start;
tempBaseValue = baseValue;
return DATDictionary.getItem(tempBaseValue).getName();
case 3:
offe = start;
start++;
i = start;
end = 0;
tempBaseValue = baseValue;
baseValue = 0;
return DATDictionary.getItem(tempBaseValue).getName();
}
}
end = 0;
baseValue = 0;
i = 0;
return null;
}
/**
* 根据用户传入的c得到单词的状态. 0.代表这个字不在词典中 1.继续 2.是个词但是还可以继续 3.停止已经是个词了
*
* @param c
* @return
*/
private int getStatement() {
checkValue = baseValue;
baseValue = DATDictionary.getItem(checkValue).getBase() + charHashCode;
if (baseValue < DATDictionary.arrayLength && (DATDictionary.getItem(baseValue).getCheck() == checkValue || DATDictionary.getItem(baseValue).getCheck() == -1)) {
return DATDictionary.getItem(baseValue).getStatus();
}
return 0;
}
public AnsjItem getItem() {
return DATDictionary.getItem(tempBaseValue);
}
@Override
public int getOffe() {
return offe;
}
}