【问题标题】:How to print array from for loop?如何从for循环打印数组?
【发布时间】:2017-08-11 06:07:11
【问题描述】:

编写简历生成器。我被困在一个必须与每所学校相对应的描述部分,但用户输入却是可变的(用户确定每所学校有多少描述点)。每次我尝试从此循环打印时,都会收到一个错误,即找不到变量。如何解决?

输入学校的循环:

//numberOfSchools is int entered by user

for (int i = 0; i < numberOfSchools; i++) {
        System.out.println("What was school " + (i + 1) + " name?");
        schoolInfo[i][0] = scan.nextLine();
        System.out.println("Where was " + schoolInfo[i][0] + " ?");
        schoolInfo[i][1] = scan.nextLine();
        System.out.println("What was your start date at " + schoolInfo[i][0]);
        schoolInfo[i][2] = scan.nextLine();
        System.out.println("What was your end date at " + schoolInfo[i][0] +
                "enter 'present' if still attending");
        schoolInfo[i][3] = scan.nextLine();

        System.out.println("How many description points would you like to add for School" + i);
        int eduDescAmount = scan.nextInt();
        String eduDesc[][] = new String[numberOfSchools][eduDescAmount];
        scan.nextLine();
        for(int j = 0; j < eduDescAmount; j++){
            System.out.println("Enter detail " + (j+1) + " for " + schoolInfo[i][0]);
            eduDesc[i][j] = scan.nextLine();
        }
    }

打印循环:

for (int r = 0; r < schoolInfo.length; r++) {
        for (int q = 0; q < schoolInfo.length; q++){
            System.out.println(eduDesc[r][q]);
        }

【问题讨论】:

  • 您遇到了什么问题?
  • 需要澄清您的问题。无法理解您需要什么。
  • 需要更多代码说明。

标签: java arrays loops for-loop multidimensional-array


【解决方案1】:

我猜问题出在您的eduDesc 变量的范围内。当你写:

for (int i = 0; i < numberOfSchools; i++) {
    /* Your Code */
    int eduDescAmount = scan.nextInt();
    String eduDesc[][] = new String[numberOfSchools][eduDescAmount]; // This means eduDesc[][] is declared as a local variable
    /* More code */
}

我所说的局部变量是指其范围被限制在定义它的范围内的变量。在您的情况下,变量 eduDesc[][]for 循环中声明,这意味着它只能在 for 循环中访问。
一旦 JVM 完成 for 循环的执行,变量 eduDesc[][] 就不再可访问,因此,如果循环外的任何代码在尝试访问该变量时编译器会抱怨,“哇!该变量在 a 范围内声明for 循环,它只对那个块是本地的!!”。

解决方案是在循环之外声明它:

int numberOfSchools = `some int`;
String eduDesc[][] = new String[numberOfSchools][]; 
for (int i = 0; i < numberOfSchools; i++) {
    /* n No of schooling work */
    eduDescAmount = scan.nextInt();
    /* More schooling here */
}

希望这个答案。

【讨论】:

  • 与其他答案相同的问题,eduDescAmount 在循环之前未知。
  • 有用,但我需要在问完所有其他问题后询问描述点的数量,并将它们与每个学校提出。即关于学校 1 的信息:x、y、z;用户想要添加2个细节:(用户输入)(用户输入)学校2:x,y,z;用户想要添加 1 个详细信息:(用户输入)建议?
  • 在进入for循环之前取numberOfSchoolseduDescAmount的值并在声明eduDesc[][]变量之前赋值,那么应该没有任何问题。
【解决方案2】:

eduDesc 在每次迭代的for 循环中再次声明。它也只在循环内可见。正确的结构如下所示:

String[][] eduDesc = new String[numberOfSchools][];
for (int i = 0; i < numberOfSchools; i++) {
    ...
    int eduDescAmount = scan.nextInt();
    eduDesc[i] = new String[eduDescAmount];
    ...
}

【讨论】:

  • 这是正确的解决方案,完美运行!我会投票,但我的声誉很低。谢谢!
【解决方案3】:

eduDesc 变量不在打印循环的范围内。每次打开块时,例如,在方法体、循环或条件中,您都会进入内部范围。这可以从外部范围访问所有变量,但是一旦您退出块,它内部定义的任何内容都不会在范围内。

通过在第一个循环之前声明eduDesc 变量,在两个循环都可以访问的范围内声明它,您将能够访问它。

【讨论】:

  • 用while循环替换'for()'循环是否可行?
  • 这不起作用,因为eduDescAmount 在循环之前是未知的。
  • @EmanuelSaunders 如果您想更换循环,您需要了解为什么要这样做。您可以使用 while 循环具有相同的行为,但您仍然需要外部范围内的 eduDesc 变量(在类级别或在执行两个循环的方法内)。由于您有预先确定的迭代次数,因此这里的 for 仍然是更好的选择。
  • 我希望有一种替代方法,我可以在问题之后要求用户在循环中定义“edu desc”。好像不是这样的。
  • 如果您想在循环中定义 eduDesc 并仍然使用它,您还需要在第一个循环中进行打印,这样 eduDesc 就在打印范围内。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多