繁体   English   中英

遍历数组的问题

[英]Trouble with Looping through Arrays

我目前正在完成一项家庭作业,并且进展顺利,直到我到达工作表上的第 4 步。 我不明白如何在移动到数组中的下一个元素时运行我的代码。 我们正在为 Java 开发人员使用 Eclipse IDE。 这是作业,以便您可以看到我在做什么(请不要帮助我回答超过我的问题)。 (哎呀,我好像不能发图片。我会努力提高我的声誉)

欢迎所有评论和建议,但请不要帮助超过第 4 步!

https://s29.postimg.org/p0n1lnemv/Screen_Shot_2014_04_15_at_10_24_49_AM.png http://s29.postimg.org/cok585qs7/Screen_Shot_2014_04_15_at_10_25_12_AM.png

到目前为止,这是我的代码(我知道不允许使用数组类,但我用它来检查我的数组):

import java.util.Scanner;
import java.util.Arrays;

public class ArrayPractice {

public static void main(String []args)

{
    System.out.println("How many food items do the gerbils eat?");
    Scanner keyboard = new Scanner(System.in);

    String diffFoods = keyboard.nextLine();
    int foodNum = Integer.parseInt(diffFoods);
    String foodNames[] = new String[foodNum];
    int foodMax[] = new int[foodNum];
    int j = 1;

    for (int i = 0; i < foodNum; i++)
    {
        System.out.println("Name of food item " +j +":");
        foodNames[i] = keyboard.nextLine();
        System.out.println("Maximum consumed per gerbil:");
        String maxCons = keyboard.nextLine();
        foodMax[i] = Integer.parseInt(maxCons);
        j++;
    }

    System.out.println("How many gerbils are in the lab?");

    String gerbs = keyboard.nextLine();
    int numGerbs = Integer.parseInt(gerbs);
    String gerbIDs[] = new String[numGerbs];
    String gerbNNs[] = new String[numGerbs];
    int gerbEat[] = new int[numGerbs];
    int k = 1;
    int arraycount = 0;
    int l = 0;

    for (int i = 0; i < numGerbs; i++)
    {
        System.out.println("Gerbil " +k +"'s lab id:");
        gerbIDs[i] = keyboard.nextLine();
        System.out.println("What name did the undergrads give to " +gerbIDs[i] +"?");
        gerbNNs[i] = keyboard.nextLine();
        System.out.println(gerbIDs[arraycount] +" eats how many " +foodNames[arraycount] +" per day?");
        String gerbConsump = keyboard.nextLine();
        int gerbEat1 = Integer.parseInt(gerbConsump);
        gerbEat[l] = gerbEat1;
        System.out.println(gerbIDs[arraycount] +" eats how many " +foodNames[arraycount + 1] +" per day?");
        String gerbConsump2 = keyboard.nextLine();
        int gerbEat2 = Integer.parseInt(gerbConsump2);
        gerbEat[l+1] = gerbEat2;

        k++;
    }

    //ONLY PROBLEM IS THE PROGRAM DOESN'T CHANGE GERBIL NAME WHEN LOOPING
    System.out.println(Arrays.toString(foodNames));
    System.out.println(Arrays.toString(foodMax));
    System.out.println(Arrays.toString(gerbIDs));
    System.out.println(Arrays.toString(gerbNNs));
    System.out.println(Arrays.toString(gerbEat));
}

}

问题出在这些行中:

System.out.println(gerbIDs[arraycount] +" eats how many " +
                   foodNames[arraycount] +" per day?");
String gerbConsump = keyboard.nextLine();
int gerbEat1 = Integer.parseInt(gerbConsump);
gerbEat[l] = gerbEat1;
System.out.println(gerbIDs[arraycount] +" eats how many " +
                  foodNames[arraycount + 1] +" per day?");

arrayCount中的gerbIDs替换为i

如果您可能超出foodNames的界限,则可能会或可能不会发生其他一些问题。 您使用arraycount + 1 ,这可能会导致您超出数组的末尾。 您似乎也根本没有增加l

您正在以非常程序化的方式处理任务。 我不知道你的老师对你有什么期望,但你可能应该创建代表FoodTypeGerbil类。

话虽如此,这里有一些见解。

问题

1. 需要嵌套循环

第一个问题是你没有使用关于沙鼠吃的食物的嵌套循环。 由于食物类型的数量是动态的(由用户提供),因此您需要要求输入与不同类型数量一样多的输入。

您当前正在重复两次提示代码:这仅在有 2 种食物时才有效。 相反,使用迭代食物类型的for循环。

2. 数组索引混乱:不需要jklarrayCount

请记住您正在迭代的内容:

  • 沙鼠(在数组gerbNNsgerbIDs
  • 食物类型(在数组foodNamesfoodMax

因此,只需要 2 个索引:例如g (沙鼠)和ft (食物类型)。

此外, jk只是在这里提供循环索引i的基于 1 的版本,您应该改用i+1 这些变量绝对不是必需的,它们使代码不必要地更难阅读。

3. 沙鼠的食物消耗

这一行是错误的:

int gerbEat[] = new int[numGerbs];

您要存储的是一只沙鼠每天消耗的一种食物 这意味着您需要一个二维数组,由我在上一节中谈到的两个索引索引:

int[][] gerbEat = new int[numGerbs][foodNum];

然后您可以通过 gerbil g使用表达式访问食物ft的每日消耗量:

gerbEat[g][ft]

一个办法

这是您的代码以及我在上一部分中谈到的修改:

String diffFoods = keyboard.nextLine();
int foodNum = Integer.parseInt(diffFoods);
String foodNames[] = new String[foodNum];
int foodMax[] = new int[foodNum];

for (int ft = 0; ft < foodNum; ft++) {
    System.out.println("Name of food item " + (ft+1) +":");
    foodNames[ft] = keyboard.nextLine();
    System.out.println("Maximum consumed per gerbil:");
    String maxCons = keyboard.nextLine();
    foodMax[ft] = Integer.parseInt(maxCons);
}

System.out.println("How many gerbils are in the lab?");
String gerbs = keyboard.nextLine();
int numGerbs = Integer.parseInt(gerbs);
String gerbIDs[] = new String[numGerbs];
String gerbNNs[] = new String[numGerbs];
int[][] gerbEat = new int[numGerbs][foodNum];

for (int g = 0; g < numGerbs; g++) {
    System.out.println("Gerbil " + (g+1) +"'s lab id:");
    gerbIDs[g] = keyboard.nextLine();
    System.out.println("What name did the undergrads give to " +gerbIDs[g] +"?");
    gerbNNs[g] = keyboard.nextLine();
    for (int ft = 0; ft < foodNum; ft++) {
        System.out.println(gerbIDs[g] +" eats how many " + foodNames[ft] +" per day?");
        String gerbConsump = keyboard.nextLine();
        int gerbEat1 = Integer.parseInt(gerbConsump);
        gerbEat[g][ft] = gerbEat1;
    }
}

更新:回应您的评论

我在文章的第一行中的意思是,与其使用多个全局数组来限定实体的不同方面(例如沙鼠),您应该使用代表这些实体的单个对象数组。

例如,您需要一些关于沙鼠的元素:

  • ID
  • 昵称
  • 每日食物消耗
  • 他们是否有逃跑的倾向
  • 他们是否咬人
  • 也许以后还有其他的东西......

所以你应该为此创建一个类:

class Gerbil {
    String id;
    String nickname;
    boolean bites;
    boolean escapes;
    int[] dailyFoodQuantity;
}

为什么要这样做? 因为收集有关实体的信息并将其抽象化是有意义的。 如果你需要返回一些Gerbil的信息,只需返回Gerbil对象,一切都在那里。 请求沙鼠的 using 代码不需要使用它的每个方面。

此外,如果某个实体被遗忘了,您可以只添加一个字段,它不会产生任何问题(无需向任何方法或任何内容添加参数)。

我不确定您在这里的确切意图,但我想您的问题是您忘记了增加 arraycount,因为在整个程序中将其定义为零并没有真正意义。 您似乎也没有增加 l。 如果这些是常量,则通过在声明中添加 final 来定义它们。

您似乎也有些困惑,for 循环中不需要有计数器,您可以使用 for 循环中定义的 int i。 例如

for(int i=0; i<10; i++){
    System.out.println(i);
}

将打印 0,1,2,3 等。它还使您的代码更具可读性。 for 循环中对循环计数器具有可预测依赖性的任何计数器都应以 i 递增。 这使得阅读更容易。 另外,请考虑代码的布局:没有注释和新行的大块让人难以理解发生了什么,在这个简单的例子中不是这样的问题,但良好的实践很重要。 将您的代码组织成具有单一逻辑目标的块,并在它们上方添加一条注释,说明该目标是什么。

此外,在您定义随机整数的情况下,要么使用自解释名称,要么进行注释,这样您就可以确切地看到应该使用什么,例如 k。

暂无
暂无

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

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