【问题标题】:Problems while iterating over an ArrayList of ArrayLists遍历 ArrayList 的 ArrayList 时出现问题
【发布时间】:2015-12-12 12:55:39
【问题描述】:

我正在尝试遍历 ArrayList 的 ArrayList - 但不知何故,我的一切都失败了,我不明白错误消息。

错误是:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.ArrayList

我尝试使用常规的 for(int i; i

public static boolean listsContains(ArrayList<ArrayList<Integer>> lists, int v) {
    boolean b = false;

    for (ArrayList<Integer> list : lists) {
        if (list.contains(v)) {
            b = true;
        } else {
            b = false;
        }
    }
    return b;
}

导致错误的实际行是“for (ArrayList list”...

已编辑:为了清楚起见,我在代码中编辑了更多声明性泛型(不幸的是,它的工作原理与我发布的第一个代码一样少)。

Edit2:好的,所以不是方法本身导致了问题,所以根据要求,这里是填充这些列表的其余代码。代码尚未完成,但我在完成时遇到了这个问题。

public static void main(String[] args) {
    Graph g = DataSource.load();

    ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();

    for(int i = 0; i < g.numberOfVertices(); i++) {
        if(!(listsContains(lists, i))) {    // add list if node is unlisted (since after first iteration one entire network is found)
            listsCreate(lists, i);
        }

        Iterator it = g.adj(i).iterator();  // create iterator for current node's edges

        if (!(it.hasNext())) {   // node has no edges
            listsCreate(lists, i);
        } else {                // node has edges, iterate through them
            while(it.hasNext()) {
                Edge current = (Edge) it.next();
                if(!(listsContains(lists, current.to))) {   // unlisted node
                    int index = listsIndexOf(lists, current.from);
                    findNetwork(g, lists.get(index), current.to);
                } else {
                    continue;       // node already listed
                }
            }
        }
    }

    System.out.println("Number of connected graphs: " + lists.size());

}   // Main

【问题讨论】:

  • 向我们展示你的方法调用。
  • 另外,重新考虑你的逻辑:它创建了一个无用的迭代器。它循环遍历所有数组列表,但只保留最后一个的结果。并使用泛型:它应该是一个 ArrayList>。或者更好的是 List>.
  • 发布所有相关代码,以及异常的完整堆栈跟踪。问题不在发布的代码中(尽管它还有其他几个问题)。您的外部列表不包含 ArrayList 实例。
  • 你是对的,它来自错误解决,我现在已经尝试了很多东西。玩了一个小时:(
  • 发布所有相关代码,以及异常的完整堆栈跟踪。问题不在发布的代码中。它在生成列表列表的代码中,实际上生成了一个包含整数的列表。

标签: java for-loop arraylist


【解决方案1】:

您没有指定内部ArrayList 的组件类型。从你的日志中我可以看出它包含Integers:

public static boolean listsContains(ArrayList<ArrayList<Integer>> lists, int v) {

    for (ArrayList<Integer> list : lists) {
        if (list.contains(v)) 
            return true;
    }

    return false; // No inner arrayList contains 'v'
}

编辑:

或使用 Java 8:

public static boolean listsContains(ArrayList<ArrayList<Integer>> lists, int v) {
     return lists.stream().anyMatch(list -> list.contains(v));
}

【讨论】:

  • 或者更好:返回lists.stream().anyMatch(list -&gt; list.contains(v));。但是缺少泛型并不能解释错误。
  • @JBNizet 实际上,它更好更快。只是我是 Java 8 菜鸟,所以...感谢更好的选择
  • 您的代码在运行时不会更改任何内容。它只会在方法调用行导致编译错误。泛型只在编译时应用,在运行时没有业务
  • @Sparta 它可能不会更快,但它更短并且更清楚地表达了意图。
  • 哇。实际上,我错过了我的一种方法尝试使用 ArrayList 而不是 ArrayList> 调用有问题的方法,而 IDE 甚至没有警告我。感谢您帮助我找到问题
【解决方案2】:

因为你测试:

list.contains(v)

list 是没有内部类型的 ArrayList 类型

v 是整数

将您的 ArrayList 替换为 ArrayList

【讨论】:

  • 这并没有解决问题,还编辑了 op 以反映这一点。感谢您的意见!
猜你喜欢
  • 2013-05-05
  • 1970-01-01
  • 2013-03-02
  • 2015-11-28
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多