#java
#java
Вопрос:
Привет всем, я задал следующий вопрос несколько дней назад, и у меня все еще возникают небольшие проблемы.
«Ниже приводится исходное сообщение» Я хочу сохранить имя студента и для каждого имени иметь два списка массивов, связанных с этим именем. Я хотел бы иметь все это в одном классе Student_quizes или что-то в этом роде
итак, я в основном пытаюсь сохранить studentName, arraylist имен запросов и arraylist quizScores в объекте. Имена запросов и контрольные будут параллельными.
Я вообще не уверен, правильно ли я это делаю, я пытался весь день и совершенно сбит с толку, есть ли у кого-нибудь предложения о том, как я мог бы лучше это сделать.
Извините, если мой вопрос сбивает с толку, я полагаю, что программа будет работать следующим образом.
введите имя учащегося
майкл
тест на ввод
Естественные науки
оценка теста ввода
80
добавить еще один тест Y / N?
Y
тест на ввод…
добавить другого ученика Y / N?
Y…
Имя студента: Майкл
название теста: наука, оценка: 80
название теста: математика, оценка: 85
имя студента: Джо
Название теста: наука, оценка 60
На данный момент мой код повсюду, но я опубликую то, что у меня есть.
Это основной
package Student_Quizes;
import java.util.ArrayList;
import java.util.Scanner;
import static student.student_main.print;
public class Student_quizes_main {
public static void main(String[] args) {
boolean addStudents = true;
addStudent();
}
public static void addStudent() {
ArrayList<Student_Quizes> students = new ArrayList<>();
Scanner in = new Scanner(System.in);
System.out.println("add student");
String studentName;
String Continue;
int quizScore;
String quizName;
boolean addStudents = true;
boolean addQuiz = true;
while (addStudents) {
System.out.println("Student Name");
studentName = in.next();
while (addQuiz) {
System.out.println("Quiz Name");
quizName = in.next();
System.out.println("average Score");
quizScore = in.nextInt();
students.add(new Student_Quizes(quizName, quizScore));
System.out.println("Add another Quiz Y/N");
Continue = in.next();
if (Continue.equalsIgnoreCase("n")) {
addQuiz = false;
}
}
System.out.println("Add another Student Y/N");
Continue = in.next();
if (!Continue.equalsIgnoreCase("n")) {
addQuiz = true;
} else {
addStudents = false;
}
}
print(students);
}
}
this is my classes
package Student_Quizes;
import java.util.ArrayList;
public class Student_Quizes {
private String studentName;
private String quizName;
private int score;
ArrayList<String> quizNames = new ArrayList<>();
ArrayList<Integer> quizScores = new ArrayList<>();
public Student_Quizes() {
studentName = "";
quizNames.add("");
quizScores.add(0);
}
public Student_Quizes(String studentName, ArrayList QuizNames, ArrayList quizScores) {
this.studentName = studentName;
this.quizNames.add(quizName);
this.quizScores.add(score);
}
public void print() {
System.out.println("Name:tt" this.studentName);
System.out.println("Quiz Name:t" this.quizNames);
System.out.println("Quiz Score:t" this.quizScores);
}
}
Since then I have reworked my code
The code i have now
this is the main
package student;
import java.util.ArrayList;
import java.util.Scanner;
public class Student_main {
public static void main(String[] args) {
//Create ArrayList of student objects
ArrayList<Student> students = new ArrayList<>();
String name;
boolean addStudent = true;
String Continue;
Scanner in = new Scanner(System.in);
//loop to add multiple students
while (addStudent) {
System.out.println("Student Name");
name = in.next();
//calls the method to add student information
addStudents(name, students);
System.out.println("Would you like to add another Student? Y/N ");
Continue = in.next();
//if user does not type n it will continue
if (Continue.equalsIgnoreCase("n")) {
addStudent = false;
}
}
System.out.println(students.toString());
}
public static void addStudents(String name, ArrayList<Student> students) {
//Parralell arrays for quiz names and quiz scores
ArrayList<String> quizNames = new ArrayList<>();
ArrayList<Integer> quizScores = new ArrayList<>();
boolean addQuiz = true;
String Continue;
Scanner in = new Scanner(System.in);
// Loop to continue adding quizzes
while (addQuiz) {
//Method yo add quiz names and scores
addQuizNames(quizNames);
addQuizScores(quizScores);
System.out.println("Would yo like to add another Quiz? Y/N ");
Continue = in.next();
if (Continue.equalsIgnoreCase("n")) {
addQuiz = false;
// adds the new student passing the students name and quiz info
students.add(new Student(name, quizNames, quizScores));
}
}
}
public static void addQuizNames(ArrayList<String> quizNames) {
String quizName;
Integer quizScore;
Scanner in = new Scanner(System.in);
System.out.println("Enter Quiz Name");
quizName = in.next();
quizNames.add(quizName);
}
public static void addQuizScores(ArrayList<Integer> quizScores) {
Integer quizScore;
Scanner in = new Scanner(System.in);
System.out.println("Enter Quiz Score");
quizScore = in.nextInt();
quizScores.add(quizScore);
}
}
Классы упаковывают student;
импортируйте java.util.Список массивов;
открытый класс Student {
private String name;
private static ArrayList<String> quizNames = new ArrayList<>();
private static ArrayList<Integer> quizScores = new ArrayList<>();
public Student(String name, ArrayList<String> quizNames, ArrayList<Integer> quizScores) {
this.name = name;
Student.quizNames = quizNames;
Student.quizScores = quizScores;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void setQuizNames(ArrayList<String> quizNames) {
Student.quizNames = quizNames;
}
public static void setQuizScores(ArrayList<Integer> quizScores) {
Student.quizScores = quizScores;
}
public ArrayList<String> getQuizNames() {
return quizNames;
}
public ArrayList<Integer> getQuizScores() {
return quizScores;
}
@Override
public String toString() {
// adds student info to a formated string
StringBuilder out = new StringBuilder();
for (int i = 0; i < quizScores.size(); i ) {
out.append("n quiz : ").append(quizNames.get(i)).append("ttScore : ").append(quizScores.get(i));
}
String finalString = out.toString();
return "nnStudent : " name finalString;
}
}
Проблема, с которой я сталкиваюсь сейчас, связана с именами запросов и оценками тестов. Я могу создать множество объектов student, и имя students будет правильным для каждого из них, но информация о тестировании будет одинаковой для каждого студента. он использует информацию о тестировании для последнего введенного студента, поэтому он в основном перезаписывает информацию о тестировании для каждого объекта student.
приветствуется любой ввод, спасибо всем 🙂
Комментарии:
1. И в чем вопрос?
2. У вас никогда, никогда, никогда не должно быть параллельных списков массивов, параллельных массивов или какой-либо параллельной структуры данных. Что вам следует сделать, так это создать класс Quiz с именем quiz и оценкой quiz. Затем в вашем классе Student у вас есть один список экземпляров Quiz.
3. @GilbertLeBlanc абсолютно прав. Либо вы должны сохранить результаты теста в классе Student, либо создать карту, в которой ключами являются имена студентов, а значениями — список результатов, которые у них есть.
Ответ №1:
Небольшая подсказка:
public class Student_Quizes {
private String studentName;
private String quizName; ...
на самом деле это хорошее начало, но здесь вы ошибаетесь:
this.quizNames.add(quizName);
this.quizScores.add(score);
Вы видите: вы хотите, чтобы ваш класс Student_Quizes позволял добавлять две части информации. Таким образом: вы не помещаете что-либо в свои два списка в конструкторе. Вместо этого вы добавляете метод, подобный
public void addQuizInfo(String name, Integer score) {
quizNames.add(name);
quizScores.add(score);
}
для вашего класса. И затем вы просто продолжаете вызывать этот метод с помощью ввода от пользователя!
Ваша проблема в основном в том, что вы собирали вещи вместе «неоднократно». Вместо этого вы должны четко разделять вещи. Чтобы сделать это более понятным; ваши имена классов уже идут в неправильном направлении. Вызовите его Student
… а затем подумайте, какими свойствами обладает студент — у него есть имя, а затем у него есть списки с тестами, над которыми он работал.
Итак, сначала вы создаете объект student:
Student newStudent = new Student(name);
и затем вы используете тот метод, который я показал выше:
student.addQuiz(quizname, score);
И, наконец: ваш код даже не будет компилироваться. Вы объявили, что ваши списки в Student_Quizes будут
ArrayList<String>
например. Такой список принимает только строку. Таким образом, вам нужно добавить их в код… другой список просто недопустим!
Наконец: вы должны использовать типы «интерфейса», такие как List, Map и так далее, В качестве типа — вы используете только конкретный класс реализации, такой как ArrayList, для вызова new, например
List<Integer> scores = new ArrayList<>();
Комментарии:
1. Спасибо вам за такой отличный ответ, который прояснил для меня ситуацию 🙂
2. Большое вам спасибо за этот ответ, он прояснил для меня все. Я слишком устал сегодня вечером, но завтра я снова буду работать над этим, поэтому я дам вам знать, как у меня получилось, еще раз спасибо 🙂
Ответ №2:
Я бы посоветовал вам использовать коллекцию Map и константы enum.
Кроме того, тип теста и оценка являются тесно связанными данными, поэтому они должны находиться в отдельном классе.
Чтобы упростить это, пожалуйста, проверьте приведенный ниже код:
Класс Enum для хранения типов запросов.
public enum QuizType {
SCIENCE, MATHS;
}
QuizResult — это класс POJO, предназначенный только для хранения данных о результатах теста.
public class QuizResult {
private QuizType quizType;
private double score;
public QuizResult(QuizType quizType, double score) {
this.quizType = quizType;
this.score = score;
}
public QuizType getQuizType() {
return quizType;
}
public void setQuizType(QuizType quizType) {
this.quizType = quizType;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
Класс StudentQuiz для операций ввода. Комментарии должны все объяснить.
public class StudentQuiz {
public StudentQuiz() {
Map<String, List<QuizResult>> students = processStudentQuizes();
// Go through the keys of the map (which is the name of students)
for(String student : students.keySet()) {
// Get all the quiz results of the student
List<QuizResult> results = students.get(student);
System.out.println(student " ");
for(QuizResult result : results) {
// Print the quiz type and the score
System.out.println(result.getQuizType().name() " " result.getScore());
}
}
}
private Map<String, List<QuizResult>> processStudentQuizes() {
Map<String, List<QuizResult>> students = new TreeMap<>();
System.out.println("Add student");
Scanner s = new Scanner(System.in);
String answer = null;
while(!"n".equalsIgnoreCase(answer)) {
System.out.println("Student Name");
String studentName = s.next();
System.out.println("Quiz Name");
String quizName = s.next();
// Check if the quiz type actually exist
boolean quizTypeOk = false;
for(QuizType type : QuizType.values()) {
if(type.name().equalsIgnoreCase(quizName)) {
// We found the quiz type, so we can break from this loop
quizTypeOk = true;
break;
}
}
if(!quizTypeOk) {
// Quiz type couldn't be found, so print the message and start the while loop again
System.out.println("No such type of quiz! Please start again!");
continue;
}
System.out.println("Average Score");
double avgScore = s.nextDouble();
// Now we can create a QuizResult object from the inputed data
QuizResult result = new QuizResult(QuizType.valueOf(quizName), avgScore);
// Check if the student already exist
if(students.containsKey(studentName)) {
// Add a new result to the list of results for the already existing student
students.get(studentName).add(result);
}
else {
// Create a new student in the map with a new results list and put the result into the list
List<QuizResult> results = new ArrayList<>();
results.add(result);
students.put(studentName, results);
}
System.out.println("Add another Student Y/N");
answer = s.next();
}
s.close();
return students;
}
public static void main(String[] args) {
new StudentQuiz();
}
}
Я надеюсь, что это поможет.
Комментарии:
1. Это отличная помощь, большое спасибо, завтра я снова займусь этим должным образом и дам вам знать, как у меня дела, еще раз спасибо 🙂
Ответ №3:
если я хорошо понял проблему, одним из решений является создание arraylist нового объекта вместо
ArrayList quizNames = новый ArrayList<>(); ArrayList quizScores = новый ArrayList<>();
новый объект будет иметь свойства quizScores и quizNames, наконец, в вашем классе создайте список этого нового объекта.