我正在尝试做的总体目标是将字符串与数组的索引0(在arraylist中保存)进行比较,如果字符串相同(忽略大小写),请调用一个方法将字符串的大小写与已翻译的单词(在arraylist中的数组的索引1处)相匹配。当我运行此代码并打印出我翻译的arraylist的内容时,我得到所有“不匹配”的字符。我假设这是因为我没有以正确的方式访问我想要的索引。请帮忙!
public static String translate(String word, ArrayList<String[]> wordList) {
if (word == "." || word == "!" || word == ";" || word == ":") {
return word;
}
for (int i = 0; i < wordList.size(); i++) {
String origWord = wordList.get(i)[0];
String transWord = wordList.get(i)[1];
if (word.equalsIgnoreCase(origWord)) { //FIXME may need to change if you need to switch from translated to original
String translated = matchCase(word, transWord);
return translated;
}
}
String noMatch = Character.toString(Config.LINE_CHAR);
return noMatch;
}
示例数据和预期结果
word =“你好”
wordList.get(i)[0] =“你好”
wordList.get(i)[1] =“Hola”
(word和wordList.get(i)[0]匹配,因此执行下一步)
调用匹配大小写方法并返回翻译后的单词,其大小写与原始单词相同 - &gt;
得知=“hola”
返回翻译后的单词。
(for循环迭代整个wordList,直到找到匹配,然后调用translate方法)
**
匹配案例代码
public static String matchCase(String template, String original) {
String matched = "";
if (template.length() > original.length()) {
for (int i = 1; i <= original.length(); i++) {
if (template.charAt(i-1) >= 'a' && template.charAt(i-1) <= 'z') {
if (i == original.length()) {
matched += original.substring(original.length() - 1).toLowerCase();
}
else {
matched += original.substring((i-1), i).toLowerCase();
}
}
else if (template.charAt(i-1) >= 'A' && template.charAt(i-1) <= 'Z') {
if (i == original.length()) {
matched += original.substring(original.length() - 1).toUpperCase();
}
else {
matched += original.substring((i-1), i).toUpperCase();
}
}
}
return matched;
}
else if (template.length() < original.length()) {
int o;
original.toLowerCase();
for (int i = 1; i <= template.length(); i++) {
if (template.charAt(i-1) >= 'a' && template.charAt(i-1) <= 'z') {
if (i == template.length()) {
matched += original.substring(original.length() - 1).toLowerCase();
}
else {
matched += original.substring((i-1), i).toLowerCase();
}
}
else if (template.charAt(i-1) >= 'A' && template.charAt(i-1) <= 'Z') {
if (i == template.length()) {
matched += original.substring(original.length() - 1).toUpperCase();
}
else {
matched += original.substring((i-1), i).toUpperCase();
}
}
String newMatched = matched + original.substring(i, original.length() - 1);
matched = newMatched;
newMatched = "";
}
return matched;
}
return original;
}
答案 0 :(得分:1)
我已经测试了您的代码,它与您提供的示例相当适用。我无法帮你解决问题。
但是有一些错误需要通知和改进建议:
matchCase
失败。==
进行比较。使用equals
方法查看why。 这不是很重要,但为什么noMatch
总是被计算出来。为什么不将它声明为常数一次?
public static final String NO_MATCH = String.valueOf(Config.LINE_CHAR);
更重要的是,我认为matchCase
并非真正与设计相关,而且过于复杂。我认为您应该确定要翻译的单词是小写还是大写,或者大写的第一个字母和小写的后面的字母。当你的长度不同时,你所做的事情(逐字逐句比较)并不恰当。
charAt
代替substring
,这样会更简单,更快。Map
进行翻译查询?...