Проблема с перебором массива

Рейтинг: -1Ответов: 2Опубликовано: 09.01.2023

Как сделать так, чтобы массив, состоящий из экземпляров класса, перебирался? В данном случае у меня реализован графический интерфейс. Моя программа должна работать так: пользователь вписывает имя в текстовое поле, и по нажатию кнопки должен идти поиск элемента массива с таким же именем. Но поиск заканчивается на первом элементе массива, а дальше перебор почему-то не происходит. С чем это может быть связано?

Класс Main, в котором я конструирую и отображаю окно, прослушиваю нажатие кнопки и провожу поиск:


import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main extends JFrame implements ActionListener {

    JFrame frame = new JFrame("FMAIT");
    JLabel name1 = new JLabel("Введите Фамилию Имя");
    JLabel information1 = new JLabel("Информация");
    JTextField name = new JTextField("");
    JTextField information = new JTextField("");
    JButton button = new JButton("Поиск");

    Main() {
        frame.setVisible(true);
        frame.setLayout(null);
        frame.setBounds(700, 400, 500, 300);

        name.setBounds(160, 40, 150, 30);
        information.setBounds(40, 100, 400, 30);
        name1.setBounds(160,5,150,20);
        information1.setBounds(190,75,100,20);

        frame.add(information1);
        frame.add(name1);
        frame.add(name);
        frame.add(information);

        button.setBounds(190, 180, 100, 50);
        button.addActionListener(this);
        frame.add(button);

    }

    public String Search(String name) {
        FMAIT a1 = new FMAIT("Левошкина Анастасия", "21010040", "23.10.2003");
        FMAIT a2 = new FMAIT("Бачище Назар", "21010056", "17.06.2004");
        FMAIT a3 = new FMAIT("Зарудный Вячислав", "21010087", "25.08.2003");
        FMAIT a4 = new FMAIT("Гурко Павел", "21010017", "patlord");
        FMAIT a5 = new FMAIT("Сахончик Михаил", "21010025", "02.01.2004");
        FMAIT a6 = new FMAIT("Пархимович Ефим", "21010106", "06.08.2004");
        FMAIT a7 = new FMAIT("Цуркан Алексей", "21010061", "**********");
        FMAIT a8 = new FMAIT("Пётух Фёдор", "21010031", "28.04.2003");
        FMAIT a9 = new FMAIT("Гайдуков Дмитрий", "21010060", "**********");
        FMAIT a10 = new FMAIT("Зайцев Александр", "21010084", "19.09.1999");
        FMAIT a11 = new FMAIT("Буланов Николай", "21010095", "07.08.2004");
        FMAIT a12 = new FMAIT("Новоёнок Иван", "21010089", "21.05.2004");
        FMAIT a13 = new FMAIT("Журавский Евгений", "21010063", "06.02.2004");
        FMAIT a14 = new FMAIT("Сопильник Павел", "21010083", "16.04.2004");
        FMAIT a15 = new FMAIT("Грибовский Александр", "21010094", "23.07.2004");
        FMAIT a16 = new FMAIT("Иванов Станислав", "21010047", "*********");

        FMAIT[] arr  = {a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16};

        for (int i = 0; i <= arr.length; i++)
            if (name.equals(arr[i].name)) {
                return "Фамилия Имя : " + arr[i].GetName() + "\n" + "ID : " + arr[i].GetID() + "\n" + "Пароль : " + arr[i].GetPassword();
            } else
                return "Ошибка поиска";
        return "";
    }

    public static void main(String[] args) {
    new Main();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
            String name1 = name.getText();
            information.setText(Search(name1));

    }
}

Это класс FMAIT:

public class FMAIT {

    String name;
    String id;
    String password;

    public FMAIT(String name,String id,String password){
        this.id = id;
        this.password = password;
        this.name = name;
    }
    String GetID(){
        return id;
    }
    String GetPassword(){
        return password;
    }
    String GetName(){
        return name;
    }
}

Ответы

▲ 1Принят
 if(name.length()>0)
        for (int i = 0; i < arr.length; i++) {
            //if (arr[i].name.contains(name)) {
            if (arr[i].name.equals(name)) {
                return "Фамилия Имя : " + arr[i].GetName() + "\n" + "ID : " + arr[i].GetID() + "\n" + "Пароль : " + arr[i].GetPassword();
            } 

        }

P.S. arr[i].name.equals <- equals можно заменить на contains для более обширного поиска

▲ 2

На самом деле проблем несколько :

  1. else return "Ошибка поиска" - должно быть за пределами цикла, т.к. при сравнивании в цикле с первым элементом массива (если этот элемент не является искомым) сразу отрабатывает данный else и возвращается "Ошибка поиска", а цикл, соответственно, прерывается.

  2. for (int i = 0; i <= arr.length; i++) должен быть заменен на for (int i = 0; i < arr.length; i++) иначе вы будете вылетать за пределы массива и ловить исключение (если элемент не будет найден).

  3. при закрытии окна на самом деле ваша программа не останавливается и это проблема. чтобы исправить это надо добавить дефолтное поведение , соответствующее закрытию окна (по умолчанию это сокрытие окна, а не закрытие программы). делается это такой строчкой кода : frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

  4. всю логику пользовательского интерфейса всегда принято запускать в отдельном потоке, дабы на ней не было тормозов, связанных с обработкой бизнесс-логики. делается это для свинга обычно с помощью вызова специального статического метода: EventQueue.invokeLater

Это были проблемы технические. Но есть еще проблемы реализации.

  1. инициализация массива в методе поиска. приводит к тому, что массив инициализируется каждый раз при вызове метода, что вообще не нужно.

  2. нарушение правил именования методов. это важно! методы именуются с маленькой буквы. ознакомьтесь с конвенцией об именовании и никогда не нарушайте ее.

  3. склейка строк конкатинацией - решение так себе, потому как это плодит огромное количество не нужных объектов. если вам нужно объединить множество стрингов в строку юзайте специальные методы/классы, к примеру, StringBuilder

  4. не игнорируйте модификаторы доступа! почему, к примеру, ваши поля не приватные? вопрос без ответа. привыкайте к необходимости писать такое корректно.

  5. ваш единственный метод, содержащий бизнесс-логику, в данном случае - это метод поиска. вы написали его так, что смысл выносить это в отдельный метод фактически исчез, ведь переиспользовать его невозможно в принципе. Он принимает четко определенный параметр , являющийся одним из полей конкретного класса, возвращает собранный специфическим способом строку либо определенный текст об ошибке. а если завтра надо искать по айди, либо снова таки по имени, но формировать ответ иначе, либо вообще на поиск поступают объекты другого класса? все перепишите? напишите тонну новых методов, фактически дублирующие ваш код? это плохое решение.

Посему попробуйте разобраться, как работает этот код. Если будут вопросы - задавайте.

import java.awt.EventQueue;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;

public class Main extends JFrame implements ActionListener {

    private final FMAIT[] arr;

    private final JFrame frame = new JFrame("FMAIT");
    private final JLabel name1 = new JLabel("Введите Фамилию Имя");
    private final JLabel information1 = new JLabel("Информация");
    private final JTextField name = new JTextField("");
    private final JTextField information = new JTextField("");
    private final JButton button = new JButton("Поиск");

    private Main() {
        frame.setVisible(true);
        frame.setLayout(null);
        frame.setBounds(700, 400, 500, 300);

        name.setBounds(160, 40, 150, 30);
        information.setBounds(40, 100, 400, 30);
        name1.setBounds(160, 5, 150, 20);
        information1.setBounds(190, 75, 100, 20);

        frame.add(information1);
        frame.add(name1);
        frame.add(name);
        frame.add(information);

        button.setBounds(190, 180, 100, 50);
        button.addActionListener(this);
        frame.add(button);

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        arr = init();
    }

    private FMAIT[] init() {
        FMAIT[] arr = {
            new FMAIT(21010040L, "Левошкина Анастасия", "23.10.2003"),
            new FMAIT(21010040L, "Бачище Назар", "17.06.2004"),
            new FMAIT(21010087L, "Зарудный Вячислав", "25.08.2003"),
            new FMAIT(21010017L, "Гурко Павел", "patlord"),
            new FMAIT(21010025L, "Сахончик Михаил", "02.01.2004"),
            new FMAIT(21010106L, "Пархимович Ефим", "06.08.2004"),
            new FMAIT(21010061L, "Цуркан Алексей", "**********"),
            new FMAIT(21010031L, "Пётух Фёдор", "28.04.2003"),
            new FMAIT(21010060L, "Гайдуков Дмитрий", "**********"),
            new FMAIT(21010084L, "Зайцев Александр", "19.09.1999"),
            new FMAIT(21010095L, "Буланов Николай", "07.08.2004"),
            new FMAIT(21010089L, "Новоёнок Иван", "21.05.2004"),
            new FMAIT(21010063L, "Журавский Евгений", "06.02.2004"),
            new FMAIT(21010083L, "Сопильник Павел", "16.04.2004"),
            new FMAIT(21010094L, "Грибовский Александр", "23.07.2004"),
            new FMAIT(21010047L, "Иванов Станислав", "**********")
        };
        return arr;
    }

    private <K, V> Optional<K> search(V searchValue, Function<K, V> function, K ... arr) {
        return Arrays.stream(arr)
                .filter(k -> Objects.equals(searchValue, function.apply(k)))
                .findAny();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new Main());
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String result = search(name.getText(), FMAIT::getName, arr)
                .map(fmait -> new StringBuilder()
                        .append("Фамилия Имя : ").append(fmait.getName())
                        .append("\nID : ").append(fmait.getId())
                        .append("\n\u041f\u0430\u0440\u043e\u043b\u044c : ").append(fmait.getPassword())
                        .toString())
                .orElse("Ошибка поиска");
        information.setText(result);
    }

}

public class FMAIT {

    private final Long id;
    private final String name;    
    private final String password;

    public FMAIT(Long id, String name, String password) {
        this.id = id;
        this.password = password;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getPassword() {
        return password;
    }

    public String getName() {
        return name;
    }
}