繁体   English   中英

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

[英]Difference between different array declarations in java

我想在图中找到所有循环并使用此解决方案在无向图中找到所有循环

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

给定图的声明像

    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

有任何想法吗?

ps抱歉,如果太愚蠢的问题,我是java新手。

UPDATE

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

以下几点可能对您有所帮助(我希望他们能以某种方式做)

关于问题标题的数组声明

在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

由于需要初始化 ,我们可以如下声明和初始化数组

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]
  • 如果您在main()调用public GraphCycleFinder(int[][] graphs) {...}应该是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],而不是将j = 0到499以外的所有维度都初始化为1。

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

希望这可以帮助!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM