我有两个不同的程序,一个包含方法" addGrade"旨在为2D阵列添加新等级(gradeTable)。 2D阵列的一个阵列是每个等级应该在的类别,第二个元素是每个类别的等级。这是该计划:
public class GradeBook {
private String name;
private char[] categoryCodes;
private String[] categories;
private double[] categoryWeights;
private double[][] gradeTable;
public GradeBook(String nameIn, char[] categoryCodesIn,
String[] categoriesIn, double[] categoryWeightsIn) {
name = nameIn;
categoryCodes = categoryCodesIn;
categories = categoriesIn;
categoryWeights = categoryWeightsIn;
gradeTable = new double[5][0];
}
public boolean addGrade(String newGradeIn) {
char row = newGradeIn.charAt(0);
int grade = Integer.parseInt(newGradeIn.substring(1));
double[] oldArr = gradeTable[row];
double[] newArr = Arrays.copyOf(oldArr, oldArr.length + 1);
newArr[newArr.length - 1] = grade;
gradeTable[row] = newArr;
return row != 0;
}
第二个程序读入一个文件作为命令参数。粗体文本表示正在读入的成绩。字母代表每个成绩应该在的类别,而数字是实际成绩。该文件是
Student1
5
a Activities 0.05
q Quizzes 0.10
p Projects 0.25
e Exams 0.30
f Final 0.30
**a100 a95 a100 a100 a100
q90 q80 q100 q80 q80 r90
p100 p95 p100 p85 p100
e77.5 e88
f92**
在第二个程序中,我尝试遍历文件中的每个等级并在其上调用addGrade方法,以便将其添加到2D数组中。我不确定如何为每个等级调用该方法。另外,我非常确定我的addGrade方法是不对的。任何帮助,将不胜感激。这是第二个程序:
public class GradeBookApp {
String fileName = "";
String name = "";
char[] categoryCodes = new char[5];
String[] categories = new String[5];
double[] categoryWeights = new double[5];
double[][] gradeTable;
if (args.length > 0) {
for (int i = 0; i < args.length; i++) {
System.out.println("Reading file \"" + args[i] + "\"."
+ "\n\tCreating GradeBook object."
+ "\n\tAdding grades to GradeBook object."
+ "\nProcessing of file complete.");
fileName = args[i];
Scanner scanFile = new Scanner(new File(fileName));
name = scanFile.nextLine();
int catCodes = Integer.parseInt(scanFile.nextLine());
for (i = 0; i < catCodes; i++) {
String[] all = scanFile.nextLine().split(" ");
if(all.length == 3 && all[0].length() == 1 && all[2].matches("(\\d+\\.\\d+)")){
categoryCodes[i] = all[0].charAt(0);
categories[i] = all[1];
categoryWeights[i] = Double.parseDouble(all[2]);
}
}
GradeBook myGB = new GradeBook (name, categoryCodes,
categories, categoryWeights);
答案 0 :(得分:0)
将每个成绩列表作为ArrayList<Double>
而不是double[]
,您会更好。 JVM(以及程序员!)每次都必须复制整个数组,以便你可以增加它的长度并增加一个新的数组。如果您使用ArrayList<Double> gradeList
,则可以
gradeList.add(grade);
无需进行所有复制。
我还会考虑将更大的结构作为Map
而不是数组。因此,您可以使用HashMap<Character,List<Double>>
将行映射到该行的成绩列表,而不是使用二维数组。这避免了必须在字符和双精度之间进行转换,这是您目前(隐含地)正在做的事情。
最后,addGrade()
方法应该采用char
和double
(一行和一个新成绩),而不是String
:你正在制作必须处理不适当的数据结构,为自己做了很多工作。
完成此操作后,为每个项目调用addGrade
应该相当容易。在您提取代表特定成绩的String
后(例如,String gr = "e77.5"
),您就可以添加到HashMap gradeMap
内的列表中,如下所示:
char row = gr.charAt(0);
double grade = Double.parseDouble(gr.substring(1));
gradeMap.get(row).add(grade);
如果您需要更多帮助,我认为您需要提供更多信息。
答案 1 :(得分:0)
您声明需要从文件中读取,但您的代码实际上都没有从文件中读取。这应该是你的第一步。尝试查看BufferedReader文档以及本网站上有关执行文件IO操作的正确方法的大量帖子。
我假设您将成绩存储在2D gradeTable数组中,如:{Category, grade}
。您将需要读取文件中的每一行(BufferedReader具有此方法),将字符串(查看String文档,特别是split或substring / indexOf方法)解析为类别和等级,然后填充数组
考虑使用更多动态数据结构,例如ArrayList
。这将允许您在添加更多成绩时扩展大小,并且无需在每次扩展时将阵列复制到新阵列中。