gpt4 book ai didi

java - java中不同数组声明的区别

转载 作者:行者123 更新时间:2023-12-01 13:41:07 25 4
gpt4 key购买 nike

我想找到图中的所有周期并使用此解决方案 Finding all cycles in undirected graphs

算法工作正常,但我想传递二维数组作为参数,但出现了一个问题:

给定的图表声明如下

    static int[][] graph =
{
{1, 7}, {1, 8}, {7, 8}, {2, 3},
{3, 4}, {6, 4},
{7, 6}, {8, 7}
};

它有效,但我使用了

int[][] intGraph = new int[500][4];
.....
intGraph[j][0] = Integer.parseInt(edge[i]);
intGraph[j][1] = Integer.parseInt(edge[i+1]);
intGraph[j][2] = Integer.parseInt(edge[i+2]);
....

我可以通过arrayname[x][y]访问两个数组值

但是当我尝试将其作为参数传递时:(上面链接中的所有算法)

    public GraphCycleFinder(int[][] graphs) {
graph = graphs;

for (int i = 0; i < graph.length; i++){
System.out.println(i); //added to check itterations
for (int j = 0; j < graph[i].length; j++)
{
//System.out.print(graph[i][j]);
findNewCycles(new int[] {graph[i][j]});
}
}

我没有得到任何结果,也没有错误。当我打印出 i 值(以检查它迭代的距离)时,它在循环遍历数组时给我 0(但应该是从 0 到 500),但从 0 打印到这个硬编码数组的数组长度。

我想有一些带有数组声明的东西,因为我尝试过

  int[][] intGraph;

然后输入诸如

之类的值
  intGraph[j][0] = Integer.parseInt(edge[i]);

但是我得到了 java.lang.NullPointerException

有什么想法吗?

P.s.抱歉,如果问题太愚蠢了,我是java新手。

更新

问题不在于数组声明。我注释掉了 findNewCycles(new int[] {graph[i][j]}); 并且 bouth 循环给出了必要的结果。该算法中的方法 findNewCycles 可能无法处理这个大数组。 :( 虽然只有 200 个顶点和 500 个边。不多。

最佳答案

以下几点可能会对您有所帮助(我希望它们能有所帮助)

数组声明至于问题标题

在java中你可以通过两种方式声明数组

  1. 数组数据类型的变量(如 int 数组类型)

    int[] a,b;//a和b都是整数数组类型

  2. 某种数据类型的数组变量(如 int)

    int c[],d;//c和d都是int类型,但只有c是数组

初始化,因为它是必需的我们可以如下声明并初始化数组

int[] a = {1, 2, 3, 4, 5};
// or
int b[][] = {{1, 2, 3}, {4, 5, 6}, {1, 3, 5}, {2, 4, 6}};

我们可以如下初始化声明的数组

a[0] = 1;
a[1] = 2*a[0]; //or any other expression

您在问题中遗漏的内容或代码/问题中可能遗漏的内容

  • graph 是边数组,边有两个顶点,因此 intGraph[500][4] 应该是 intGraph[500][2]
  • public GraphCycleFinder(int[][] graphs) {...} 如果您在 main() 中调用它,则应为 static如上所述,最后关闭 } 丢失。
  • 正如 shoover 所说,您还必须初始化 intGraph[j]

我们的意思是在代码中

.....
intGraph[j][0] = Integer.parseInt(edge[i]);
intGraph[j][1] = Integer.parseInt(edge[i+1]);
intGraph[j][2] = Integer.parseInt(edge[i+2]);
....

您仅初始化同一行中的一个维度,或者例如,如果 j=1,则您将 intGraph[1][0] 初始化为 intGraph[1][3],但不适用于除 1 之外的所有 j=0 到 499 .

很可能会遇到 NPE ,因为使用 int [][]intGraph; 你没有初始化它的所有元素并尝试在函数中复制未初始化的数组public GraphCycleFinder(int[][] graphs){graph=graphs;...}并且在使用 int [][]intGraph=new int[500][4]; 时无法获得它,因为您正在初始化所有元素并且不存在 NULL 值。

希望这有帮助!

关于java - java中不同数组声明的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20766313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com