1

好的,大家好,我对 java 编程很陌生,我真的遇到了数组问题。我的程序应该读取每行包含 3 个数字的 .txt 文件(这是关于卡路里的问题,第一个数字表示早餐,第二个表示午餐,第三个表示晚餐)

所以我创建了一个 Array.list(卡路里),因为它会从长度未知的文件中读取。到目前为止,它现在工作了,我将值放入一个数组中,但我想将该数组拆分为三个一维数组。早餐值的数组,午餐的另一个值和晚餐的最后一个值。

我的问题是我无法弄清楚如何划分主数组的长度以将大小分配给我的其他 3 个不同数组中的每一个。(我尝试了类似 array.length / 3 的方法,但它给了我一个 IndexOutOfBounds 错误)我知道它非常混乱和一切 :( 但我几乎不明白这一点,如果你至少能给我一个想法,我将非常感激!

import java.util.*; 
import java.util.ArrayList;
import java.io.*;

public class lab {

public static void main(String[] args) {
    readData("ARRAYLAB1.txt");   //read file arraylab1.txt
}
static void readData(String filename) {
    try {

        List<Integer> calories = new ArrayList<Integer>();  
        // Defining an integer Array List

        Scanner myfile = new Scanner(new FileReader("ARRAYLAB1.txt")); 
        // Reading file using Scanner

        while (myfile.hasNext()) {     
            calories.add(myfile.nextInt());   // Read file content using a while loop
            } 

        int[] array = new int[calories.size()];    //Pass the array list to an array
        for(int i = 0; i < calories.size(); i++) 
            array[i] = calories.get(i);


       int size = array.length / 3;  //This didn't work 

       int[] breakfast = new int[size];   <---  index out of bounds error 
       int[] lunch = new int[size];
       int[] dinner = new int[size]; 


       //the rest just assigns each value to their respective array 
        int counter = 1;
        int j = 0;
        int k = 0;
        int x = 0;
        for (int i = 0; i < array.length; i++) {
            if (counter == 1) {
                breakfast[j] = array[i]; 
                counter++;
                j++;
                continue;
                }
            if (counter == 2) {
                lunch[k] = array[i]; 
                counter++;
                k++;
                continue;
            }
            if (counter == 3) {
                dinner[x] = array[i]; 
                counter = 1; 
                x++;
                continue;
            }
        }


        myfile.close(); // close the file


    }  catch (Exception e) {     // Defined it just in the case of error
        e.printStackTrace();   
    }
  } 
}
4

2 回答 2

1

size 必须是一个 int 值。当您获取索引超出范围异常时,只需在监视窗口中添加大小变量即可验证您确实有一个整数值。更好地将大小值四舍五入以成为整数,因为当它不是 3 的倍数时,除以 3 不会给您整数值。您也可以将其转换为整数。

如果您的长度值是 3 的倍数,那么您的代码应该可以正常工作。

于 2013-09-12T02:45:45.223 回答
1

Archit 一针见血。如果您没有精确的三的倍数,那么当您将值分配给 (breakfast/lunch/dinner) 数组时,实际上会发生索引越界。为了避免这种情况,您可以使用一个动态大小的数组,称为数组列表(就像您用于卡路里一样)。并避免除以 3 的问题。

然后代码变为:

List<Integer> calories = new ArrayList<Integer>();  

Scanner myfile = new Scanner(new FileReader("ARRAYLAB1.txt")); 

while (myfile.hasNext()) {     
    calories.add(myfile.nextInt());   // Read file content using a while loop
} 

List<Integer> breakfast = new ArrayList<Integer>();
List<Integer> lunch = new ArrayList<Integer>();
List<Integer> dinner = new ArrayList<Integer>();

//the rest just assigns each value to their respective array 
int counter = 1;
for (int i = 0; i < calories.size(i); i++) {
    if (counter == 1) {
        breakfast.add(calories.get(i)); 
        counter++;
        continue;
    }
    if (counter == 2) {
        lunch.add(calories.get(i)); 
        counter++;
        continue;
    }
    if (counter == 3) {
        dinner.add(calories.get(i)); 
        counter = 1; 
        continue;
    }
}
于 2013-09-12T02:52:06.303 回答