如何在arraylist中访问数组?

时间:2017-12-04 16:33:33

标签: java arrays arraylist

我正在尝试做的总体目标是将字符串与数组的索引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; 
}

1 个答案:

答案 0 :(得分:1)

我已经测试了您的代码,它与您提供的示例相当适用。我无法帮你解决问题。

但是有一些错误需要通知和改进建议:

    当模板比翻译后的单词短时,
  1. matchCase失败。
  2. 切勿将字符串与==进行比较。使用equals方法查看why
  3. 这不是很重要,但为什么noMatch总是被计算出来。为什么不将它声明为常数一次?

    public static final String NO_MATCH = String.valueOf(Config.LINE_CHAR);

  4. 更重要的是,我认为matchCase并非真正与设计相关,而且过于复杂。我认为您应该确定要翻译的单词是小写还是大写,或者大写的第一个字母和小写的后面的字母。当你的长度不同时,你所做的事情(逐字逐句比较)并不恰当。

  5. 当您考虑单个字符时,请使用charAt代替substring,这样会更简单,更快。
  6. 您还可以查看regex来分析您的字符串。
  7. 您是否考虑过Map进行翻译查询?
  8. ...