0

我是新来的,我正在寻找作业方面的帮助。我的任务是在 20 名球员的文件中获取一个包含棒球运动员数据(球员 id、命中、步行、出局)的文件(1 5 1 3),并打印出一个带有列标题的表格(球员 id、击球平均,步行)。击球率是通过击球手击球(击球+出局)来确定击球率的。我已经为此工作了几个小时,并且不断收到 ArrayIndexOutOfBoundsException,我知道这意味着我已经超出了数组的限制,但我不知道如何修复它。我尝试/抓住了我认为是问题的地方,至少我得到了一些开始看起来像我的桌子的东西。到目前为止,我将我的工作发布在输出下方。

Please enter the name of the file containing player statistics.
data
java.lang.ArrayIndexOutOfBoundsException: 1
java.lang.ArrayIndexOutOfBoundsException: 6
java.lang.ArrayIndexOutOfBoundsException: 2
java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.ArrayIndexOutOfBoundsException: 4
java.lang.ArrayIndexOutOfBoundsException: 4
java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 2
java.lang.ArrayIndexOutOfBoundsException: 6
java.lang.ArrayIndexOutOfBoundsException: 1
java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.ArrayIndexOutOfBoundsException: 2
java.lang.ArrayIndexOutOfBoundsException: 8
java.lang.ArrayIndexOutOfBoundsException: 3
java.lang.ArrayIndexOutOfBoundsException: 9
java.lang.ArrayIndexOutOfBoundsException: 4
java.lang.ArrayIndexOutOfBoundsException: 10
java.lang.ArrayIndexOutOfBoundsException: 5
java.lang.ArrayIndexOutOfBoundsException: 11
java.lang.ArrayIndexOutOfBoundsException: 6
java.lang.ArrayIndexOutOfBoundsException: 12
java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.ArrayIndexOutOfBoundsException: 13
java.lang.ArrayIndexOutOfBoundsException: 8
java.lang.ArrayIndexOutOfBoundsException: 14
java.lang.ArrayIndexOutOfBoundsException: 9
java.lang.ArrayIndexOutOfBoundsException: 15
java.lang.ArrayIndexOutOfBoundsException: 10
java.lang.ArrayIndexOutOfBoundsException: 16
java.lang.ArrayIndexOutOfBoundsException: 9
java.lang.ArrayIndexOutOfBoundsException: 17
java.lang.ArrayIndexOutOfBoundsException: 8
java.lang.ArrayIndexOutOfBoundsException: 18
java.lang.ArrayIndexOutOfBoundsException: 7
java.lang.ArrayIndexOutOfBoundsException: 19
java.lang.ArrayIndexOutOfBoundsException: 6
java.lang.ArrayIndexOutOfBoundsException: 20
java.lang.ArrayIndexOutOfBoundsException: 4
  Player ID     Bat Avg      Walks
       0           0           0

import java.util.Scanner;
import java.io.*;


public class Lab5 {

int [][] table;
String [] rowPlayers;
String [] colStats;

/**
 * Default constructor
 */
public Lab5() {
    table = new int[0][0];
    rowPlayers = new String[0];
    colStats = new String[0];
}

/**
 * Constructor based on scanner
 * @param rowLabels
 * @param colLabels
 * @param inFile
 */
public Lab5(String[] rowLabels, String[] colLabels, Scanner inFile){
    rowPlayers = rowLabels;
    colStats = colLabels;
    table = new int[rowPlayers.length][colStats.length];
    int row;
    int column;
    while (inFile.hasNext()){
        row = inFile.nextInt();
        column = inFile.nextInt();
        try{
        table[row][column]++;
        }
        catch(ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }
    }
}

/**
 * Converts the table to a string
 * @return
 */
public String toString() {
    String str = "";

    for (int index = 0; index < colStats.length; index++)
        str = str + "     " + colStats[index];
    str = str + "\n";

    for (int index = 0; index < table.length; index++){
        str = str + rowPlayers[index] + "";
        for (int index2 = 0; index2 < table[index].length; index2++)
            str = str + "           " + table[index][index2];
        str = str + "\n";
    }
    return str;
}

/**
 * Determines each players batting average
 * @return
 */
public String battingAverage(){
    String str = " ";
    float batAvg;

    for (int index = 0; index < rowPlayers.length; index++){
        batAvg = table [index][1] / (table[index][1] + table[index][3]);
    }
    return str;
}

/**
 * Driver
 * Creates a table displaying the players ID number, batting average and walks.
 * @param args
 * @throws java.io.IOException
 */
public static void main (String[] args) throws IOException{
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter the name of the file containing player statistics.");
    String fileName = in.nextLine();
    Scanner inFile = new Scanner(new FileReader("C:\\Users\\Ryan\\IdeaProjects\\Lab5\\src\\" + fileName + ".txt" ));
    String [] rowLabels = {""};
    String [] colLabels = {" Player ID", "Bat Avg", " Walks"};

    Lab5 playerStats = new Lab5(rowLabels, colLabels, inFile);
    System.out.println(playerStats);
    inFile.close();
}

}

4

1 回答 1

1

问题

出现ArrayOutOfBoundException在该行

table[row][column]++;

因此,其中一个rowcolumn两个都超出了表格的大小。您的数组tab在之前像这样初始化:

table = new int[rowPlayers.length][colStats.length];

但是 rowPlayers 只是一个包含空字符串的数组,所以它的大小是1.

根据您的问题陈述,您输入数据的第一列是玩家的 ID,它是您读入的内容row。每次玩家的 ID 不同于 0(似乎一直如此)时,您就会遇到 ArrayOutOfBoundsException。

同样的事情也适用于第二维。我不知道您在编写该算法时的推理是什么,但您似乎没有朝着正确的方向前进。

一些忠告

首先,如果您在读取输入之前不知道玩家人数,您应该使用 List 而不是数组。如果您确实知道玩家人数,请使用该人数初始化数组(但您仍然可以使用列表)

其次,考虑使用一个对象来表示您从输入文件中读取的每一行,而不是一个表。那不是 a int[][],而是 aList<Row>或 a Row[]。使用您读取的实际数据(“player id”、“hits”、“walks”和“outs”)命名对象 Row 的每个字段。这将使事情变得更加清晰。

然后您可以浏览该行列表并进行计算。

于 2013-11-03T02:05:42.923 回答