在ArrayList中更新所有匹配字母的实例

4
我正在尝试更新一个字符串ArrayList,其中包含字母,如果另一个ArrayList中存在某个字母,则需要进行更新。但是,代码只会在第一次遇到该字母时更新,而不是所有实例。ArrayList word 包含字母 h,e,l,l,o, ,w,o,r,l,d,而 ArrayList underscores 包含与word中每个字母对应的下划线。对于word中的每个字母,我想获取它的索引并在相同的索引处使用该字母更新underscores。例如,对于l,我想更新underscores以显示除了在word中找到字母l的索引之外的下划线。
import java.util.ArrayList;

class Main {
  public static void main(String[] args) {
    ArrayList<String> word = new ArrayList<String>();
    word.add("h");
    word.add("e");
    word.add("l");
    word.add("l");
    word.add("o");
    word.add(" ");
    word.add("w");
    word.add("o");
    word.add("r");
    word.add("l");
    word.add("d");

    for (String letter:word) {
      System.out.print(letter);
    }

    System.out.println();

    ArrayList<String> underscores = new ArrayList<String>();
    for (String letter:word) {
      if (letter.equals(" ")) {
        underscores.add(" ");
      } else {
        underscores.add("-");
      }
    }

    for (String letter: underscores) {
      System.out.print(letter);
    }
    String l = "l";
    for (String s:word) {
      if (s.equals(l)) {
        int index = word.indexOf(s);
        underscores.set(index, l);
      }
    }
    System.out.println();
    for (String s:underscores) {
      System.out.print(s);
    }
  }
}

3
你能否提供明确的输入和预期输出,包括所有边缘案例的数据? - Tim Biegeleisen
为什么要使用 ArrayList<String> 来表示字符集合?可以使用 ArrayList<Character> 或者使用单个 String,并迭代其字符数组。 - Eran
你的“问题”在于你在word中查找索引并在underscore中进行更新。Word始终是“hello world”,word.indexOf(s)每次都会给出“l”的第一个索引。 - tobsob
@Eran 当我第一次读到这个问题时,我想到的是为什么不使用正则表达式替换呢?但是,也许任务要求采用这种方法。 - Tim Biegeleisen
1个回答

2
问题在于word.indexOf(s)总是返回给定元素的第一个出现位置的索引。来自List文档:

返回此列表中指定元素的第一次出现的索引,如果此列表不包含该元素,则返回-1。更正式地说,返回最低索引i,使得(o==null ? get(i)==null : o.equals(get(i))),如果没有这样的索引,则返回-1。

您可以使用简单的旧的for循环而不是使用for-each循环,在underscores列表中更新给定位置的字符串:
 for (int i = 0; i < underscores.size(); i++) {
    if (word.get(i).equals(l)) {
        underscores.set(i, l);
    }
}

and the output will be :

hello world
----- -----
--ll- ---l-

谢谢Michalk!这完美地解决了我一直无法成功实现的问题。太棒了。 - sgoodman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接