[英]Trouble with Looping through Arrays
我目前正在完成一項家庭作業,並且進展順利,直到我到達工作表上的第 4 步。 我不明白如何在移動到數組中的下一個元素時運行我的代碼。 我們正在為 Java 開發人員使用 Eclipse IDE。 這是作業,以便您可以看到我在做什么(請不要幫助我回答超過我的問題)。 (哎呀,我好像不能發圖片。我會努力提高我的聲譽)
歡迎所有評論和建議,但請不要幫助超過第 4 步!
到目前為止,這是我的代碼(我知道不允許使用數組類,但我用它來檢查我的數組):
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
。
您正在以非常程序化的方式處理任務。 我不知道你的老師對你有什么期望,但你可能應該創建代表FoodType
和Gerbil
類。
話雖如此,這里有一些見解。
第一個問題是你沒有使用關於沙鼠吃的食物的嵌套循環。 由於食物類型的數量是動態的(由用戶提供),因此您需要要求輸入與不同類型數量一樣多的輸入。
您當前正在重復兩次提示代碼:這僅在有 2 種食物時才有效。 相反,使用迭代食物類型的for
循環。
j
、 k
、 l
和arrayCount
請記住您正在迭代的內容:
gerbNNs
和gerbIDs
)foodNames
和foodMax
) 因此,只需要 2 個索引:例如g
(沙鼠)和ft
(食物類型)。
此外, j
和k
只是在這里提供循環索引i
的基於 1 的版本,您應該改用i+1
。 這些變量絕對不是必需的,它們使代碼不必要地更難閱讀。
這一行是錯誤的:
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;
}
}
更新:回應您的評論
我在文章的第一行中的意思是,與其使用多個全局數組來限定實體的不同方面(例如沙鼠),您應該使用代表這些實體的單個對象數組。
例如,您需要一些關於沙鼠的元素:
所以你應該為此創建一個類:
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.