Когда я для l oop через ArrayList с условием If отображаются элементы перед искомыми - PullRequest
0 голосов
/ 28 февраля 2020

Я хотел создать программу, которая является объектно-ориентированной и состоит из студентов, хранящихся в ArrayList в классе Grade. У каждого ученика есть имя, фамилия и возраст. Поэтому я хотел, чтобы sh вернул всю информацию об одном ученике из ArrayList в консоли с помощью сканера. Поэтому я в основном сохраняю заданное пользователем значение и сравниваю его в операторе if с именами или фамилиями в ArrayList, используя for-l oop. Если переданное имя не совпадает ни с одним из имен в ArrayList, в сообщении говорится, что человек не существует в этом классе.

Это работает, но если я через oop через ArrayList, чтобы привлечь человека например, по индексу 2, сообщение о том, что человек не существует в этом классе, всплывает для индексов 0 и 1, и я этого не хочу.

Я из Германии, поэтому большинство материалов написано на немецком. Это код:

package package_Fachklassen;

import java.util.Scanner;

public class Startklasse {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Schoolclass sk1, sk2;
        sk1 = new Schoolclass("WG 13-1");
        sk2 = new Schoolclass("WG 13-2");

        //Klasse 13-1

        Student s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
        s1 = new Student ("Gonzalo", "Cofre Real", 18, sk1);
        s2 = new Student ("Swaastika", "Yogeswaran", 20, sk1);
        s3 = new Student ("Derin", "Sipahi", 19, sk1);
        s4 = new Student ("Henry", "Reinhold", 19, sk1);
        s5 = new Student ("Sara", "Perkovic", 19, sk1);
        s6 = new Student ("Honia", "Aref", 19, sk1);
        s7 = new Student ("Finn", "Bolheimer", 17, sk1);
        s8 = new Student ("Karoline", "Garkos", 18, sk1);
        s9 = new Student ("Hannah", "Hirth", 18, sk1);
        s10 = new Student ("Sarah", "Schwarz", 18, sk1);

        sk1.addStudent (s1);
        sk1.addStudent (s2);
        sk1.addStudent (s3);
        sk1.addStudent (s4);
        sk1.addStudent (s5);
        sk1.addStudent (s6);
        sk1.addStudent (s7);
        sk1.addStudent (s8);
        sk1.addStudent (s9);
        sk1.addStudent (s10);

        //Klasse 13-2

        Student  ss1, ss2, ss3, ss4, ss5, ss6;
        ss1 = new Student ("Cem", "Yildiz", 19, sk2);
        ss2 = new Student ("Fathima", "Baba", 19, sk2);
        ss3 = new Student ("Sanjie", "Bislimi", 19, sk2);
        ss4 = new Student ("Jasmine", "Jaffari", 19, sk2);
        ss5 = new Student ("Hannah", "Arent", 19, sk2);
        ss6 = new Student ("Niklas", "Genf", 18, sk2);

        sk2.addStudent (ss1);
        sk2.addStudent (ss2);
        sk2.addStudent (ss3);
        sk2.addStudent (ss4);
        sk2.addStudent (ss5);
        sk2.addStudent (ss6);



        while(true) {
            Scanner scan = new Scanner(System.in);
            System.out.println("Which class does your student visit?");
            String k_input= scan.nextLine();
            if(k_input.equals(sk1.getDescription())) {
                System.out.println("For which student in class 13-1 are you looking for?");
                String n_input = scan.nextLine();
                for(int i = 0; i < sk1.getListLength(); i++) {
                    if(n_input.equals(sk1.getStudent(i).getName()) || n_input.equals(sk1.getStudent(i).getSurname())) {
                        System.out.println("Your student:");
                        System.out.println(" " + sk1.getStudent(i).getName());
                        System.out.println(" " + sk1.getStudent(i).getSurname());
                        System.out.println(" " + sk1.getSchueler(i).getAge());
                        break;
                    }
                    else if(){
                        System.out.println("Student does not exist in this class!");
                    }
                }
            }
        }
    }
}
  • Какой класс посещает ваш студент?
  • (ввод пользователя) WG 13-1
  • Для какого студента в классе 13-1 вы ищете?
  • (ввод пользователя) Derin
  • Ученик не существует в этом классе!
  • Ученик не существует в этом классе!
  • Ваш ученик:
  • Дерин
  • Сипахи
  • 19
  • Какой класс посещает ваш ученик?

Ответы [ 4 ]

1 голос
/ 28 февраля 2020

Он делает это потому, что каждый раз, когда вы oop, если это был не тот студент, которого вы искали, он печатает то, что вы сказали ему, в вашем утверждении else.

Что вам нужно сделать, так это вообще не добавлять «другое». Вместо этого, когда вы найдете ученика внутри своего «если» ... сохраните его в переменной для последующего анализа после того, как вы полностью выйдете из своего l oop. Не забудьте объявить эту переменную хранения до вашего l oop, чтобы вы могли использовать ее после того, как вы больше не в l oop. Это может быть строка, которая строит весь ваш ответ, который вы отправляли на выход ... но в этом случае мы сохраняем его для отображения позже.

Установите его в null, когда вы объявите его.

Затем, когда вы полностью закончите, ваш l oop ... сломается или нет ... вы протестируете эту переменную, и вот где Вы можете сказать, найдено ли это что-то или нет (если оно все еще равно нулю или нет.) Вы знаете это, проверяя, было ли оно все еще пустым, или было ли заполнено ответом в то время как в l oop.

Если в нем есть ответ (еще не ноль) ... это когда вы выводите его пользователю.

А если все еще был ноль ... тогда вы говорите пользователю, что не нашли любой такой студент.

0 голосов
/ 29 февраля 2020

Ответ на вопрос был довольно прост, и благодаря предложению пользователя программа наконец-то сработала так, как должна.

Мне в основном пришлось избавиться от оператора else после предложения if и настроить логическая переменная до этого. Если параметр if равен true, информация об учениках отображается в консоли, а логическая переменная объявляется как false, поэтому опрос начинается снова. Затем мне пришлось написать новый оператор if для случая, когда логическая переменная имеет значение true и отображает сообщение об ошибке.

Вот новый код:

while(true) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Welche Klasse besucht der gesuchte Schüler?");
        String k_input= scan.nextLine();
        if(k_input.equals(sk1.getBezeichnung()) || k_input.equals(sk2.getBezeichnung())) {
            System.out.println("Welchen SChüler aus Klasse 13-1 suchen Sie?");
            String n_input = scan.nextLine();
            boolean studentmissing = true;
            for(int i = 0; i < sk1.getListenLaenge(); i++) {
                if(n_input.equals(sk1.getSchueler(i).getName()) || n_input.equals(sk1.getSchueler(i).getNachname())) {
                    studentmissing = false;
                    System.out.println("Ihr Schüler:");
                    System.out.println(" " + sk1.getSchueler(i).getName());
                    System.out.println(" " + sk1.getSchueler(i).getNachname());
                    System.out.println(" " + sk1.getSchueler(i).getAlter());
                    break;
                }}
                if(studentmissing) {
                    System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
                    System.out.println("--------------------------------------------------------");
                }
0 голосов
/ 28 февраля 2020

Ваша ошибка в том, что ваше предложение else содержит другое выражение if (else if ()), которое всегда истинно и выполняется. В вашем примере вы ищете ученика 3 «Derin», который не соответствует первому ученику (Gonzalo), поэтому в другом случае выполняется печать, что ученик не существует. То же самое происходит со вторым учеником, и затем третий ученик обнаруживается и для l oop выходит. Когда вы выбираете другого ученика, например, пятого в списке, сообщение «не найден» будет напечатано четыре раза, а затем сообщение для найденного ученика. Вы получите максимальное количество не найденных сообщений, когда введете имя, которое не соответствует ни одному из студентов.

Когда вы измените свой код только на else { ... } (как упомянуто выше), произойдет то же самое. Это становится намного проще, когда вы делаете две вещи, которые хотите выполнить sh, в два этапа: во-первых, попытайтесь найти учащегося и запомнить его с помощью переменной типа Schueler, затем напечатайте учащегося / ошибку сообщение. Для этого вам нужно переместить вывод студента / сообщение об ошибке за пределы для l oop. Вот фиксированный код:

Schueler foundStudent = null;
for(int i = 0; i < sk1.getListenLaenge(); i++) {
    if (n_input.equals(sk1.getSchueler(i).getName()) || n_input.equals(sk1.getSchueler(i).getNachname())) {
        foundStudent = sk1.getSchueler(i);
        break;
} 

if (foundStudent != null) {
    System.out.println("Ihr Schüler:");
    System.out.println(" " + foundStudent.getName());
    System.out.println(" " + foundStudent.getNachname());
    System.out.println(" " + foundStudent.getAlter());
} else {       
    System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
}
0 голосов
/ 28 февраля 2020

Как вы могли бы решить эту проблему - вывести отсутствующий отпечаток студента за пределы для l oop, чтобы просто напечатать его, когда ученик не найден.

Ваша проблема заключается в том, что для каждого учащегося вы не находите, что вы печатаете пропавших студентов, пока не найдете студента Мое предложение ниже далеко от самого сложного решения.

Boolean StudentMissing = True
for(int i = 0; i < sk1.getListenLaenge(); i++) {
  if(n_input.equals(sk1.getSchueler(i).getName()) || n_input.equals(sk1.getSchueler(i).getNachname())) {
    System.out.println(" " + sk1.getSchueler(i).getAlter());
    StudentMissing = False
    break;
  }
}
if(StudentMissing){
  System.out.println("Schüler existiert nicht oder ist nicht in dieser Klasse!");
}
...