我最后一次获得帮助的尝试对我来说解释不清楚,所以我想我会再试一次并且更清楚。
我正在编写一个程序,该程序应该让用户输入课程中的考试,家庭作业和测验的数量,然后是所有这些作业中每个学生的分数。例如:
Please provide grade item details
Exams (number, points, weight):3 100 60
Quizzes (number, points, weight):3 10 20
Homework (number, points, weight):3 10 20
What would you like to do?
1 Add student data
2 Display student grades & statistics
3 Plot grade distribution
4 Quit
Your choice: 1
Enter student data:
data>Bob Jones: e100 e80 e90 q10 q10 q0 h10 h5 h10
data>Joe Smith: e85 e90 e100 q10 q10 q5 h0 h10 h5
data>Sam Johnson: q10 h10 h0 h10 e60 e100 e90 q10 q8
我的主要问题是我正在努力解决如何将一行数据分成四个不同的数组:一个用于名称,一个用于考试分数,一个用于测验分数,一个用于家庭作业分数。
此处显示了我到目前为止所做的尝试:
if(input == 1){
for(int i = 0; i <= students;){
for (boolean done = false;done == true;){
System.out.println("Enter student data: ");
System.out.print("data>");
String[] readInput = s.next().split(":");
String name = readInput[0];
String scoreString = readInput[1];
String [] scores = scoreString.split("\\s+");
char type = scores[0];
String inputscore = scores.substring(1);
int score = Integer.valueOf(inputscore);
if (type == 'e'){
所以我试图做的是将输入的数据行拆分为一个名为readInput的数组,其中索引0是名称,索引1是分数列表。然后我创建了两个字符串,一个名为name,一个名为score,来自索引0和1的数据。然后我的想法是在每个输入的分数(&#34; e100&#34;例如)之前读取字符以确定哪个数组应该进入。我觉得我是以一种没有多大意义的方式做到这一点,并且可能有一种更简单的方法来做到这一点,但我在这里试图找到一块墙它出来了。
我的另一个问题是,当用户未能输入所有分数时(例如,课程中有3个考试,但用户只输入两个考试分数),未输入的分数将作为0进入数组。但这会自动发生吗?
答案 0 :(得分:1)
你走在正确的道路上;考虑一下你需要分成什么来获得所有不同的考试成绩。一切似乎被一个空间隔开,那么为什么不再分裂呢?
String[] scoreArray = scores.split(" ");
for(String score : scoreArray) {
if(score.startsWith("e")) {
//add to exam array
} else if(score.startsWith("q")) {
//add to quiz array
} else if(score.startsWith("h")) {
//add to homework array
}
}
就您的第二个问题而言,这些分数不会自动输入为0。您将需要检测给定数组是否已满(使用“数字”值作为“成绩项详细信息”的输入)。如果它没有满,那么用剩余部分用0填充它。
答案 1 :(得分:0)
您可以使用此方法
if (input == 1){
String name = readInput[0];
String scores = readInput[1];
String s[]=scores.split("\\s+");
examArray=0,harray=0;
for(int i=0;i<s.length();i++){
if(s.startsWith("e")) {
string str=s.subString(1,s.length());
exam[examArray++]=Integer.valueOf(str);
}else
{
// same for different cases
}
}
}
答案 2 :(得分:0)
首先,我认为您需要一个辅助方法来获取特定类型分数的计数。接受String
的内容并返回char
出现的次数。您可以使用String.toCharArray()
和增强型for-each
loop来获取计数,
private static int countChar(String in, char v) {
int count = 0;
if (in != null) {
for (char ch : in.toCharArray()) {
if (ch == v) {
count++;
}
}
}
return count;
}
然后您可以使用正则表达式,例如\\D
匹配单个非数字,\\d+
匹配连续数字。因此,您可以使用它来创建Pattern
,然后迭代grades
数组,如
String str = "Bob Jones: e100 e80 e90 q10 q10 q0 h10 h5 h10";
Pattern p = Pattern.compile("(\\D)(\\d+)");
String[] input = str.split("\\s*:\\s*"); // optional white space \\s*
System.out.println("Name: " + input[0]);
String[] grades = input[1].split("\\s+"); // one (or more) consecutive
// white space characters \\s+
int[] exams = new int[countChar(input[1], 'e')];
int[] quizs = new int[countChar(input[1], 'q')];
int[] homework = new int[countChar(input[1], 'h')];
int epos = 0, qpos = 0, hpos = 0;
for (String grade : grades) {
Matcher m = p.matcher(grade);
if (m.matches()) {
String type = m.group(1);
if (type.equals("e")) {
exams[epos++] = Integer.parseInt(m.group(2));
} else if (type.equals("q")) {
quizs[qpos++] = Integer.parseInt(m.group(2));
} else if (type.equals("h")) {
homework[hpos++] = Integer.parseInt(m.group(2));
}
}
}
System.out.println("Homework: " + Arrays.toString(homework));
System.out.println("Quizs: " + Arrays.toString(quizs));
System.out.println("Exams: " + Arrays.toString(exams));
输出
Name: Bob Jones
Homework: [10, 5, 10]
Quizs: [10, 10, 0]
Exams: [100, 80, 90]