Как я могу сохранить строку и два параллельных списка массивов в объекте. (java)

#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, наконец, в вашем классе создайте список этого нового объекта.