#java #arraylist
#java #arraylist
Вопрос:
Надеюсь, мой заголовок имеет смысл. То, что я пытаюсь сделать со своим кодом, — это читать файл построчно, в котором есть атрибуты о студентах (идентификатор студента, имя, фамилия и т.д.) и курсы, которые они прошли. Я почти уверен, что мой буферизованный reader работает нормально, но я немного теряюсь, когда дело доходит до спецификаций моей программы. Проблема возникает, когда я добавляю объекты списка массивов CourseList к объектам ArrayList для студентов. Код работает нормально, но не добавляет списки курсов к объектам student. По сути, я создаю 2 списка учащихся, в которых должны храниться относящиеся к ним курсы. ie) Student1, Course1, Course2 и т.д..
Заранее благодарю вас, вот мой код:
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringTokenizer;
public class studentDir {
static int currentStudent = 0;
public static void main(String args[]) throws IOException{
ArrayList<Student> students = new ArrayList<Student>();
Scanner input = new Scanner(new File("WarmUpData.txt"));
while(input.hasNextLine()) {
String line = input.nextLine();
StringTokenizer st = new StringTokenizer(line,",");
while(st.hasMoreTokens()){
String first, last, idNo;
last = st.nextToken();
first = st.nextToken();
System.out.println("Added student: " last ", " first);
idNo = st.nextToken();
System.out.println("Stored ID: " idNo);
Student s = new Student(last, first, idNo);
students.add(s);
line = input.nextLine();
st = new StringTokenizer(line,",");
while(st.hasMoreTokens()){
String x = st.nextToken();
System.out.println("If controller read in: " x);
if(x.equals("-999")){
line = input.nextLine();
st = new StringTokenizer(line, ",");
System.out.println("Added Credits amp; GPA");
Float totalCredits = Float.parseFloat(st.nextToken());
Float gpa = Float.parseFloat(st.nextToken());
students.get(currentStudent).storeGPA(totalCredits, gpa);
System.out.println("GPA Read In : " students.get(currentStudent).getGPA());
currentStudent ;
}
else{
System.out.println("Adding course.");
String courseID = x;
float credits = Float.parseFloat(st.nextToken());
String grade = st.nextToken();
System.out.println(x ", " grade);
CourseList cl = new CourseList(courseID,grade,credits);
s.add(cl);
System.out.println(cl.toString());
System.out.println(courseID " " credits " " grade " added.");
line = input.nextLine();
st = new StringTokenizer(line,",");
}
}
for(Student x : students)
System.out.println(x.toString());
}
}
input.close();
currentStudent = 0;
}
}
import java.util.ArrayList;
public class Student {
private String firstName;
private String lastName;
private String studentID;
private float gpa;
private float totalCredits;
private ArrayList<CourseList> courses = new ArrayList<>();
Student(String y, String x, String z){
this.firstName = x;
this.lastName = y;
this.studentID = z;
}
public String toString(){
String x = (this.firstName " " this.lastName " " this.studentID ".");
return x;
}
public void setGPA(float x){
this.gpa = x;
}
public float getGPA(){
return gpa;
}
public String getID(){
return this.studentID;
}
public void gpaCalc(Student stu, String id){
totalCredits = 0;
}
public void storeGPA(float tcredits, float gpa){
this.gpa = gpa;
this.totalCredits = tcredits;
}
public void add(CourseList cl) {
}
}
public class CourseList {
String idNo, grade, courseID;
float credits;
float gpa;
public CourseList(String x, String y, float z) {
this.courseID = x;
this.grade = y;
this.credits = z;
}
public String toString(){
String x = ("Course ID: " this.courseID ", Grade : " this.grade ", Credits Earned : " this.credits ".");
return x;
}
public float getCredits() {
return this.credits;
}
}
Input:
Jones,Mary,903452
4342,2.5,A
3311,4,B
-999
6.5,3.569
Martin,Joseph,312345
4598,3,C
1122,3,A-
2467,4,A
-999
10,3.31
Output:
Added student: Jones, Mary
Stored ID: 903452
If controller read in: 4342
Adding course.
4342, A
Course ID: 4342, Grade : A, Credits Earned : 2.5.
4342 2.5 A added.
If controller read in: 3311
Adding course.
3311, B
Course ID: 3311, Grade : B , Credits Earned : 4.0.
3311 4.0 B added.
If controller read in: -999
Added Credits amp; GPA
GPA Read In : 3.569
Mary Jones 903452.
Added student: Martin, Joseph
Stored ID: 312345
If controller read in: 4598
Adding course.
4598, C
Course ID: 4598, Grade : C, Credits Earned : 3.0.
4598 3.0 C added.
If controller read in: 1122
Adding course.
1122, A-
Course ID: 1122, Grade : A-, Credits Earned : 3.0.
1122 3.0 A- added.
If controller read in: 2467
Adding course.
2467, A
Course ID: 2467, Grade : A, Credits Earned : 4.0.
2467 4.0 A added.
If controller read in: -999
Added Credits amp; GPA
GPA Read In : 3.31
Mary Jones 903452.
Joseph Martin 312345.
Заранее спасибо, ребята!
Комментарии:
1. Метод Student#add ничего не делает
2. Рассматривали ли вы возможность использования HashMap?
3. Я не просматривал весь код ur , но while(st.hasMoreTokens()) если этот цикл повторяется дважды в вашем первом ученике, вы в конечном итоге получите students.get(1) пока у вас только один ученик, возможно, это не связано с проблемой, но переосмыслите способ отслеживанияваш текущий ученик
Ответ №1:
ИМХО, использование ArrayList двух разных типов здесь не очень хорошая идея. Вы должны использовать что-то вроде Map<Student, ArrayList<Course>>
. Это:
- Удобочитаемый и, следовательно, поддерживаемый.
- Его тип безопасен.
- Позволяет выполнять такие операции, как поиск всех курсов, пройденных любым студентом, для завершения в O(1).
Комментарии:
1. К сожалению, спецификации программы требуют либо связанного списка, либо списка массивов, я думаю, что в будущем мой инструктор попросит use использовать более надежные типы данных и методы поиска.
Ответ №2:
В вашем обрезанном коде ваш метод addCourse пуст
public void add(CourseList cl) {
}
Я думаю, это ваша проблема здесь
Комментарии:
1. Есть идеи о том, как запрограммировать этот метод? Я не полностью разбираюсь в ArrayLists.
2. @xfbim tutorialspoint.com/java/util/arraylist_add_index.htm Это может быть полезно для понимания того, как добавлять элементы в ArrayList
Ответ №3:
Просто установите для ArrayList of CourseList значение Student Class, тогда он будет работать
public class studentDir {
static int currentStudent = 0;
public static void main(String args[]) throws IOException{
ArrayList<Student> students = new ArrayList<Student>();
ArrayList<CourseList> courseLists=new ArrayList<>();
Scanner input = new Scanner(new File("WarmUpData.txt"));
while(input.hasNextLine()) {
String line = input.nextLine();
StringTokenizer st = new StringTokenizer(line,",");
while(st.hasMoreTokens()){
String first, last, idNo;
last = st.nextToken();
first = st.nextToken();
System.out.println("Added student: " last ", " first);
idNo = st.nextToken();
System.out.println("Stored ID: " idNo);
Student s = new Student(last, first, idNo);
line = input.nextLine();
st = new StringTokenizer(line,",");
while(st.hasMoreTokens()){
String x = st.nextToken();
System.out.println("If controller read in: " x);
if(x.equals("-999")){
line = input.nextLine();
st = new StringTokenizer(line, ",");
System.out.println("Added Credits amp; GPA");
Float totalCredits = Float.parseFloat(st.nextToken());
Float gpa = Float.parseFloat(st.nextToken());
students.get(currentStudent).storeGPA(totalCredits, gpa);
System.out.println("GPA Read In : " students.get(currentStudent).getGPA());
currentStudent ;
}
else{
System.out.println("Adding course.");
String courseID = x;
float credits = Float.parseFloat(st.nextToken());
String grade = st.nextToken();
System.out.println(x ", " grade);
CourseList cl = new CourseList(courseID,grade,credits);
courseLists.add(cl);
s.setCourses(courseLists);
System.out.println(cl.toString());
System.out.println(courseID " " credits " " grade " added.");
line = input.nextLine();
st = new StringTokenizer(line,",");
}
students.add(s);
}
for(Student x : students)
System.out.println(x);
}
}
input.close();
currentStudent = 0;
}
}
class Student {
private String firstName;
private String lastName;
private String studentID;
private float gpa;
private float totalCredits;
private ArrayList<CourseList> courses = new ArrayList<>();
Student(String y, String x, String z) {
this.firstName = x;
this.lastName = y;
this.studentID = z;
}
public String toString() {
String x = (this.firstName " " this.lastName " " this.studentID ".");
return x;
}
public void setGPA(float x) {
this.gpa = x;
}
public float getGPA() {
return gpa;
}
public String getID() {
return this.studentID;
}
public void gpaCalc(Student stu, String id) {
totalCredits = 0;
}
public void storeGPA(float tcredits, float gpa) {
this.gpa = gpa;
this.totalCredits = tcredits;
}
public ArrayList<CourseList> getCourses() {
return courses;
}
public void setCourses(ArrayList<CourseList> courses) {
this.courses = courses;
}
}
class CourseList {
String idNo, grade, courseID;
float credits;
float gpa;
public CourseList(String x, String y, float z) {
this.courseID = x;
this.grade = y;
this.credits = z;
}
public String toString() {
String x = ("Course ID: " this.courseID ", Grade : " this.grade ", Credits Earned : " this.credits
".");
return x;
}
public float getCredits() {
return this.credits;
}
}