例如有两个文件original,translation
original代表被翻译的文件
translation代表翻译使用的数据文件
对应关系如下
Sample Translation Table
(
'dog'=>'pero'
'small'=>'micro'
'small pig'=>'mini peroes'
'joe is man'=>'el jpse'
)
要求优先匹配大字符串,既如有small和small pig要先匹配small pig
因为两个文件都有可能比较大,所以同时要求尽量要求算法的效率。算法要求用贪婪法。
急求解答,不甚感激!!!
original代表被翻译的文件
translation代表翻译使用的数据文件
对应关系如下
Sample Translation Table
(
'dog'=>'pero'
'small'=>'micro'
'small pig'=>'mini peroes'
'joe is man'=>'el jpse'
)
要求优先匹配大字符串,既如有small和small pig要先匹配small pig
因为两个文件都有可能比较大,所以同时要求尽量要求算法的效率。算法要求用贪婪法。
急求解答,不甚感激!!!
private static HashMap<String, String> dictionary = new HashMap<String, String>();
static {
dictionary.put("abc", "111");
dictionary.put("abc def", "222");
dictionary.put("abc def xyz", "333");
dictionary.put("def", "777");
dictionary.put("def xyz", "888");
dictionary.put("xyz", "999");
}
private static String text = "111 abcd xyz def xyzd abc def xyz xyz";
public static String translate(String text) {
StringBuilder resultBuffer = new StringBuilder();
String temp = " " + text+" ";
int[] prefixs = computePrefix(temp);
if (prefixs.length == 0)
return text;
int index = 0;
LOOP:
do {
for (int i = prefixs.length - 1; i > index; i--) {
String key = temp.substring(prefixs[index] + 1, prefixs[i]);
if (dictionary.containsKey(key)) {
resultBuffer.append(dictionary.get(key)).append(" ");
index = i;
continue LOOP;
}
}
resultBuffer.append(temp.substring(prefixs[index]+1, prefixs[index+1])).append(" ");
index++;
}while (index < prefixs.length - 1);
return resultBuffer.substring(0, resultBuffer.length() - 1).toString();
}
private static int[] computePrefix(String text) {
ArrayList<Integer> list = new ArrayList<Integer>();
boolean inWord = false;
int first = -1;
for(int i = 0; i < text.length(); i++) {
if (text.charAt(i) != ' ') {
first = i;
list.add(first - 1);
inWord = true;
break;
}
}
if (first == -1)
return new int[0];
for (int i = first ; i < text.length(); i++) {
if (text.charAt(i) == ' ') {
if (inWord) {
list.add(i);
inWord = false;
}
} else if (!inWord) {
inWord = true;
}
}
int[] results = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
results[i] = list.get(i);
}
return results;
}
public static void main(String[] args) {
System.out.println(translate(text));
}}