void topologicalSortUtil(int v, boolean visited[], Stack<Integer> stack, ArrayList<Integer>[] adj) {
visited[v] = true;
for (int i : adj[v]) {
if (!visited[i]) {
topologicalSortUtil(i, visited, stack, adj);
}
}
stack.push(v);
}
这里,我调用的是arraylist的数组。正如我的 IDE (IntelliJ) 所告诉的,错误出现在增强的 for 循环中。这似乎是一个完全有效的调用,因为 adj[v] 将返回一个 ArrayList 和整数 i 捕获数组中的每个元素,然后在递归调用中处理它们。
@Alex Shesterov 等人, 以下是生成 adj 的代码。
ArrayList[] arr = new ArrayList[n+1];
for(int i=0; i<=n; i++){
arr[i] = new ArrayList<Integer>();
}
arr[1].add(Arrays.asList(8,6,2));
arr[2].add(Arrays.asList(7));
arr[3].add(Arrays.asList(6));
arr[4].add(Arrays.asList(5,2));
arr[5].add(Arrays.asList(4,2,3));
arr[6].add(Arrays.asList(3,2,5));
arr[7].add(Arrays.asList(2));
arr[7].add(Arrays.asList(1,2,4));
最佳答案
生成数组的代码不正确且类型不安全。您可能会从编译器收到有关“不安全类型”或“原始类型”的警告。以下是原始类型的使用:
ArrayList[] arr = new ArrayList[n+1];
您永远不应该使用类型 ArrayList
没有某种类型声明。
然后初始化 arr
的每个元素成为ArrayList<Integer>
。但由于它被分配给原始类型数组元素,编译器不知道该元素是 ArrayList<Integer>
并且不会警告您下一步,这是不好的一步:
arr[1].add(Arrays.asList(8,6,2));
您将一个元素添加到 arr[1]
中的列表中。 add
方法添加一个 single 元素,这是传递给它的对象。那个物体是什么?这是一个 List
,由 Arrays.asList(...)
制作.
所以不要有 ArrayList<Integer>
你有一个原始的ArrayList
它有一个元素,并且该元素是一个整数列表。当然,这不能转换为 Integer
.
而不是使用 add
你应该使用addAll
。 addAll
方法将其接收到的集合中的所有元素添加到调用它的集合中。
arr[1].addAll(Arrays.asList(8,6,2));
最好不要混合数组和列表,而是传递列表列表并为其指定适当的类型。
尝试避免原始类型并消除代码中的所有原始类型或不安全类型警告(不是@SupressWarnings
!),除非您开始为泛型集合编程库并且您知道自己在做什么。
关于java.lang.ClassCastException : java. util.Arrays$ArrayList 无法转换为 java.lang.Integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343971/