簡體   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