【问题标题】:Comparing chars in String elements of an arraylist causing indexoutofboundsexception比较数组列表的字符串元素中的字符导致 indexoutofboundsexception
【发布时间】:2014-09-12 21:37:16
【问题描述】:

我应该比较 arraylist(String) 中的字符,然后如果所有字符串都有公共字符或字符或没有公共字符,我必须显示 arraylist 的所有字符串中的公共字符数。 这是我的功能:

public void theElementor(ArrayList<String> x) {
    char a;
    ArrayList<String> store = new ArrayList<String>();
    for (int i = 0; i <= x.size(); i++) {
        for (int j = x.size()-1; j > i; j--) {
                for (int l = 0; l < x.get(j).length(); l++) { \\error here
                    if (x.get(i).contains(
                            Character.toString(x.get(j).charAt(l)))) {
                        a = x.get(j).charAt(l);
                    store.add(Character.toString(a));
                    }

            }
        }
    }
    for (String element : store) {
        System.out.println(element);
    }
}

我已经弄清楚了这么多,我不再收到我之前遇到的错误,但仍然无法获得我输入的所有字符串中常见的一个或多个字符。

【问题讨论】:

  • 如果int j = x.size() 那么x.get(j) 将产生错误。你需要从 size - 1 开始。
  • 这一行有点奇怪:x.remove(j).charAt(l);。为什么对刚刚删除的条目执行charAt,然后不使用该值?
  • @HotLicks 我也试过了,现在当第三个循环运行并且 if 语句成立时,我得到了同样的错误。
  • @HotLicks 谢谢你,我明白了,我正在上传修改后的代码,第三个 for 循环仍然出错

标签: java arraylist


【解决方案1】:

在 Java 中,列表的有效索引范围从 0size() - 1,而不是 size()。错误的原因是您的 ij for 循环。改变

for (int i = 0; i <= x.size(); i++) {
    for (int j = x.size(); j > i; j--) {

for (int i = 0; i < x.size(); i++) {            // <= becomes <
    for (int j = x.size() - 1; j > i; j--) {    // x.size() becomes x.size() - 1

【讨论】:

  • 他故意向后索引,这样他就可以做到remove。你的计划会打破这一点。
  • 试过了,现在当 if 语句成立时,我得到了同样的错误。
  • @HotLicks 我的更正如何阻止向后索引? j for 循环仍然从末尾开始; j的初始值更正为x.size() - 1
【解决方案2】:

试试这样的模式:

  • 将所有字符存储在集合中
  • 遍历集合并打印字符 对所有字符串都通用

示例代码(如果我理解正确的话)

public static void main(String[] args) {
    List<String> x = new ArrayList<String>();
    x.add("abcdef");
    x.add("bcdefg");
    x.add("bbccff");

    Set<Character> all = new HashSet<Character>();
    for (String s : x) {
        for (int i = 0; i < s.length(); i++) {
            all.add(s.charAt(i));
        }
    }

    for (Character c : all) {
        if (charIsCommon(c, x)) {
            System.out.println(c);
        }
    }
}

/*
 * return true only if each string in [list] contains character [c]
 */
private static boolean charIsCommon(char c, List<String> list) {
    for (String s : list) {
        if (s.indexOf(c) < 0) {
            return false;
        }
    }
    return true;
}

【讨论】:

  • 我应该可以输入我自己的字符串,它们也可以是可变长度的。
  • 谢谢!这很好用,但你能详细说明你做了什么吗?我不能完全理解这是如何工作的。
  • 首先,这会从所有字符串中读取所有字符并添加 each 字符进行设置。在此之后,我们的集合存储了 7 个元素 {a,b,c,d,e,f,g} - 尝试:System.out.println(all)。其次,我们遍历我们的集合(c 是集合中的当前元素)并检查 char c 是否存在于 x ArrayList 的 each 字符串中。为此,我们使用了 izolated 方法 - charIsCommon(c,x)。此方法遍历作为参数传递的列表中的所有字符串,并且当且仅当所有字符串都包含该字符时才返回 true。请参阅 String.indexOf 方法。
猜你喜欢
  • 2015-01-23
  • 2017-02-02
  • 2019-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多