java中不同数组声明之间的区别

时间:2013-12-24 20:12:51

标签: java arrays graph multidimensional-array depth-first-search

我想在图表中查找所有周期并使用此解决方案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个边缘。不多。

1 个答案:

答案 0 :(得分:1)

以下是一些可以帮助你的要点(我希望他们以某种方式做到)

数组声明与问题标题

相同

在java中,你可以用两种方式声明数组

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

    int[] a,b; //both a and b are of integer array type

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

    int c[],d; //both c and d are of int type but only c is array

  3. 初始化,因为它是必需的 我们可以按如下方式声明和初始化数组

    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) {...}如果您在static中调用main(),则}应为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]); .... 。{/ li>
    • 正如shoover所说,你必须初始化int [][]intGraph;

    我们的意思是代码

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

    你只是在同一行中初始化一个维度,或者例如如果j = 1那么你将intGraph [1] [0]初始化为intGraph [1] [3]而不是所有j = 0到499除外1

    并且很可能遇到 NPE ,因为int [][]intGraph=new int[500][4];您没有初始化所有元素并尝试在函数{{1}}中复制未初始化的数组 并且在使用{{1}}时你没有得到它,因为你正在初始化所有元素并且没有NULL值。

    希望这有帮助!!