【问题标题】:Iterating through all slots that are not null, 2d array?遍历所有非空的插槽,二维数组?
【发布时间】:2013-01-31 21:19:16
【问题描述】:

我必须使用二维数组。数组中行槽的最大长度为 100。通常情况下,这些数组槽中的 5-20 个将被填充,而不是更多,但是,我必须将我的代码构建为最多 100 行。我的问题是,有没有办法只遍历已设置的数组槽,在最后一个未设置的空槽之前停止?

//initialize array
String[][] variables = new String[numVariables][100];

//System.out.printf("%s \n", numVariables);

for(int i=0; i < numVariables; i++){
    //reads in variable line
    String variableLine = fin.nextLine();

    //turn variable line into array
    varArray = variableLine.split(" ");

    numRules = Integer.parseInt(varArray[0].replaceAll("\\s",""));

    for(int j=0; j < numRules+1; j++){
        variables[i][j] = varArray[j+1];

        System.out.printf("%s ", variables[i][j]);
    }
    System.out.println("\n");
}

//**LATER IN MY CODE ****//
//ITERATE THROUGH 'variables' array and PRINT OUT ONLY VALUES THAT ARE SET

【问题讨论】:

  • 真的需要使用数组吗?如果空值经常出现并且是一个“问题”,如果位置与您相关,更好的方法可能是使用其他一些标准结构,如列表或地图。
  • 是的,这是一项要求,正如帖子的第一行所述。不过感谢您的回复。

标签: java arrays loops


【解决方案1】:

如果您按 0 到 100 的顺序填充数组。如果前 51 个元素填充了字符串,那么您可以使用:

    for(int i=0; i < numVariables; i++){
        for(int j=0; j < numRules+1; j++){
            if (variables[i][j] == null)
                break;
            System.out.printf("%s ", variables[i][j]);
        }
    }

【讨论】:

  • 这是一个简单的解决方案,可以满足我的需求。谢谢!经过一些测试后将标记为解决方案...
【解决方案2】:

如果您不需要它们,为什么还要存储它们? String[][] 是一个字符串数组的数组——那些内部数组不需要具有相同的长度。因此,您可以使用所需的元素数量创建每个内部数组:

           //initialize array
            String[][] variables = new String[numVariables][];

            //System.out.printf("%s \n", numVariables);

            for(int i=0; i < numVariables; i++){
                //reads in variable line
                String variableLine = fin.nextLine();

                //turn variable line into array
                varArray = variableLine.split(" ");

                numRules = Integer.parseInt(varArray[0].replaceAll("\\s",""));

                variables[i] = Arrays.copyOfRange(varArray, 1, numRules - 1);
            }

然后迭代:

for (String[] var : variables) {
    for (String s : var) {
        System.out.print(s);
    }
    System.out.println();
}

【讨论】:

  • 考虑到奇怪的要求,我确信他的作业问题使他将其实例化为一个 100 元素数组。还有,new String[][numVariables] 不应该是new String[numVariables][]吗?
  • @PeterElliott:您对语法是正确的,已解决。至于他是否需要一个固定的长度:他发布的代码中没有任何内容需要这样做 - 但谁知道他正在尝试使用该数组来完成?
【解决方案3】:

您可以使用List&lt;String&gt; 的数组,也可以跟踪所有行的长度。

int [] rowLength = new int[numVariables]

for(int i=0; i < numVariables; i++){
    /* ... */

    numRules = Integer.parseInt(varArray[0].replaceAll("\\s",""));

    // store the number of slots in variable[i]
    rowLength[i] = numRules+1;

    /* ... */
}

然后你只从零迭代到你的行的长度 (rowLength[i])。

第三种方法(也是我更喜欢的方法)是不指定数组中行槽的长度:

String [][] variables = new String[numVariables][];

然后在计算完 numRules 之后:

variables[i] = new String[numRules+1];

【讨论】:

    【解决方案4】:

    鉴于您所描述的情况,您可能最好使用其他数据结构,但如果您不能,您可以记录已更改的值。

    因此,您可以保留每行长度的数组,并在那里结束对该行的每次搜索。

        String[][] variables = new String[numVariables][100];
        int rowLength[] = new int[numVariables];
    
        //...
        // get and record the rowLength
        //...
    
        for(int x=0; x < numVariables; x ++) {
            for(int y=0; y < rowLength[x]; y ++) {
                // do your stuff
            }
        }
    }
    

    或者您可以使用地图或 ArrayList 来跟踪每个包含数字的位置。

    【讨论】:

      猜你喜欢
      • 2019-03-18
      • 2019-11-24
      • 2016-09-04
      • 2017-03-17
      • 2013-03-14
      相关资源
      最近更新 更多