Java数组:从文本文件到数组

时间:2014-02-19 02:43:40

标签: java arrays file

编辑: 我是一名初学Java程序员,我的作业似乎无法弄明白。 我的指示是:<​​/ p>

Program Description:  Read 20 pairs of numbers (ID number and score respectively) into two separate arrays.  Find the average score.  Print a table as shown below of the ID, score and difference (score - average) for each student, one student per line.  Print the sum, average, and count of score at the head of the table as shown.  Round the average and difference to 2 decimal places.

Sample Output:

Sum     =   4853 
Average = 242.65 
Count   =   20 
Id       Score     Diff 
115 257     14.35
123 253     10.35 
116 246       3.35
113 243       0.35 
112 239      -3.65
104 239      -3.65 
110 238      -4.65
218 243       0.35
208 242      -0.65 
222 223    -19.65 
223 230    -12.65
213 229    -13.65 
207 228    -14.65 
203 224    -18.65 
305 265     22.35 
306 262     19.35 
311 256     13.35 
325 246       3.35
321 245       2.35 
323 245       2.35 

我相信,一旦将数据存入阵列,我就可以完成工作,我似乎无法超越这个初始步骤。任何帮助,将不胜感激。

代码:

 import java.util.*;
 import java.io.*;
 public class prog402a
{
public static void main (String [] args)
{
    Scanner inFile = null;
    try 
    {
        // Create a scanner to read the file, file name is parameter
        inFile = new Scanner (new File("prg402a.dat.txt"));
    } 
    catch (FileNotFoundException e) 
    {
        System.out.println ("File not found!");
        // Stop program if no file found
        System.exit (0);
    }


    int[] Array = new int[100];


    for (int index = 0; index < Array.length; index++)
    {
        int id = inFile.nextInt();
        int score = inFile.nextInt();

    }
    for (int index = Array.length; index >= 0; index++)
    {
        System.out.println(Array[index]);
    }

}

}

数据文件:

115 257
123 253
116 246
113 243
112 239
104 239
110 238
218 243
208 242
222 223
223 230
213 229
207 228
203 224
305 265
306 262
311 256
325 246
321 245
323 245
302 242

3 个答案:

答案 0 :(得分:0)

您的代码有几个问题。首先,您正在读取数据的结尾,Scanner在找不到要读取的整数时抛出异常。替换第一个for循环:

for (int index = 0; index < Array.length; index++)

使用:

while (inFile.hasNextInt())

其次,您不能将数据存储在任何地方。赋值是创建两个数组,但您只声明一个。你需要解决这个问题。最后,你的最后一个循环(打印数据)是非常错误的。第一次循环将崩溃,因为100不是Array的合法索引。此外,您从顶部开始向下,但是递增 index。另外,我建议您跟踪实际读取的数据对数量,并将其用于循环限制,而不是Array.length。解决这些问题,你应该有一个成功读取数据并打印出来的程序。

编辑:

这是您的程序版本(未经测试),应将数据读入两个独立的数组(根据作业):

public class prog402a
{

    public static void main (String [] args)
    {
        Scanner inFile = null;
        try 
        {
            // Create a scanner to read the file, file name is parameter
            inFile = new Scanner (new File("prg402a.dat.txt"));
        } 
        catch (FileNotFoundException e) 
        {
            System.out.println ("File not found!");
            // Stop program if no file found
            System.exit (0);
        }

        int[] ids = new int[100];
        int[] scores = new int[100];
        int count = 0;

        while (inFile.hasNextInt())
        {
            ids[count] = inFile.nextInt();
            scores[count] = inFile.nextInt();
            count++;
        }
        for (int index = 0; index < count; index++)
        {
            System.out.println(ids[index] + " " + scores[index]);
        }
    }
}

答案 1 :(得分:0)

我猜问题在于你对数组的处理。例如在First for循环中java编译器如何知道在Array [index]中存储inFile.nextInt()的值的位置?每次你声明一个新的变量,如int score等。你需要使用数组索引来完成你的工作。以下代码可以帮助您

int[] Array = new int[100];


for (int index = 0; index < Array.length; index++)
{
     Array[index]= inFile.nextInt();
     Array[index] = inFile.nextInt();

}
for (int index = Array.length; index >= 0; index++)
{
    System.out.println(Array[index]);
}

答案 2 :(得分:0)

这是一种方法:

public static void main(String[] args) throws IOException {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(new File("directory", "data.txt")));
    } catch (FileNotFoundException e) {
        System.out.println("File not found!");
        System.exit(0);
    }

    List<Integer> idsList    = new ArrayList<>();
    List<Integer> scoresList = new ArrayList<>();

    String line = reader.readLine();
    while (line != null) {
        String[] data = line.split(" ");
        idsList.add( Integer.parseInt(data[0]));
        scoresList.add( Integer.parseInt(data[1]));
        line = reader.readLine();
    }

    reader.close();

    Integer[] idsArray    = (Integer[])idsList.toArray(new Integer[idsList.size()]);
    Integer[] scoresArray = (Integer[])scoresList.toArray(new Integer[idsList.size()]);

    for (int index = 0; index < idsArray.length; index++) {
        System.out.println(idsArray[index] + " " + scoresArray[index]);
    }
}

BufferedReader允许您逐行阅读。 List允许您使用动态列表。 toArray方法将List转换为常规数组。 Integer.parseInt将字符串转换为整数。这不是编码的最佳方式。我试图不要过多地修改你的代码,所以你仍然可以理解它。

可以在代码中进行一些改进(捕获IO异常,在finally块中调用close()(我们的autocloseable try-with-resources),检查NumberFormatExceptions等。