Создание итеративных переменных через цикл

Я новичок в Java и изучаю классы и объекты.

В качестве практического упражнения я создаю библиотеку книг. Я хочу, чтобы пользователь вводил данные для книги, используя Scanner. Я знаю, что у меня нет цикла while, но я хотел бы разобраться в коде для добавления 1 книги, прежде чем я это сделаю.

В настоящее время я застрял в том, как перебирать и добавлять несколько книг. Например, если пользователь решит добавить книгу, я предполагаю, что он должен добавить книги типа book1name= Booklist.name. А когда пользователь хочет добавить еще одну книгу, я предполагаю, что это должно быть book2name= Booklist.name. Однако я пытаюсь понять, как это выполнить (автоматически изменить его с book1name на book2name) и как изменить имя переменной во время работы кода.

import java.util.Scanner;

public class BookLibrary {
    int counter=1;
    public static void main (String[]args) {
        Scanner choiceScan=new Scanner(System.in);
        System.out.println("Do you want to 1:Add a book or 2:Remove a book");       
        int choice= choiceScan.nextInt();
        if (choice==1) {
            System.out.println("You want to add a book");
            addBook();
        }
        
    }
    public static void addBook() {
        Scanner entryScan=new Scanner(System.in);
        System.out.println("Enter the Name of the book");
        String name=entryScan.nextLine();
        System.out.println("Enter the Author of the book");
        String author=entryScan.nextLine();
        
    }   
}

public class BookList {
    String name;
    String author;
    int bookNum;
    
    public BookList(){
        
    }
    
    public void printLibrary() {
        System.out.println("Book name: "+name );
        System.out.println("Author: " +author);
        System.out.println("Book Number: "+bookNum);
    }
    
    
}

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

Hovercraft Full Of Eels 12.08.2024 14:27

В вашем курсе должны быть закрытые циклы (включая переменные в циклах), если у вас есть такие упражнения. если это не так, то уроки от oracle — хорошее место для начала.

Chaosfire 12.08.2024 14:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ключевая концепция, которую вам не хватает, — это коллекция, такая как список или массив. (В Java первый вариант значительно проще использовать.)

Вместо пятнадцати переменных (Book book0, Book book1, ..., Book book14) у вас есть List<Book> (произносится как «Список книг»):

Список можно создать следующим образом:

List<Book> books = new ArrayList<>();

Затем вы можете добавить в него книги:

Book myBook = ...;
books.add(myBook);

...получите оттуда книгу:

Book theThirdBook = books.get(2); // Zero indexed: 0 is the first one

...и проверим, сколько их:

int bookCount = books.size();

Такие коллекции, как List, также предлагают множество других полезных функций, но это три наиболее важные для начала работы.

Существуют также различные другие типы коллекций, такие как Set (который игнорирует повторяющиеся элементы) и Map (который позволяет присваивать элементам имена или другие идентификаторы вместо того, чтобы просто называть их «пятым добавленным мной элементом»). Однако List, пожалуй, самый важный и хорошая отправная точка.

Большое спасибо за вашу помощь. Учитывая мой предыдущий опыт работы с Python, я думал об этом, поскольку обычно я бы это сделал именно так. Предыстория. Я следовал порядку преподавания в моем университете и работаю над их учебной программой неделю за неделей, а списки и массивы - это, по глупости, одна из последних вещей, которые там есть. Если я могу спросить, каково реалистичное использование классов и объектов для человека моего уровня (студента 1-го курса университета)? Например, когда и почему мне нужно их использовать? Честно говоря, я застрял на этой теме уже несколько дней и не могу уложить в голове эту тему.

Jash2204 12.08.2024 14:44

На самом деле вопрос заключается в присвоении имен переменным в цикле, чтобы добавить более одной книги, а не в возможных структурах данных для хранения книг.

Chaosfire 12.08.2024 14:47

@Jash2204: Jash2204: Когда вы новичок, классы и объекты могут показаться слишком сложными, а пользы от этого мало. Это часто справедливо, когда вы имеете дело с крошечными проектами, которые вы выполняете на ранних курсах программирования; их часто можно решить, не беспокоясь об этом. Однако как только вы начнете работать с реальными проектами (или фактически начнете работать над большими системами), классы и объекты быстро станут неоценимыми в качестве инструмента для организации сложных фрагментов кода и данных в более простые для понимания и обслуживания блоки.

BambooleanLogic 12.08.2024 14:48

@Chaosfire ну да, мы знаем. Но он новичок в этом языке, и, исходя из Python, мы понимаем это заблуждение. Мы не роботы, и лучший способ ответить на этот вопрос — объяснить концепции.

Diego 12.08.2024 14:49

@Chaosfire: Я считаю, что это проблема XY. На самом деле вопрос не в том, как иметь переменные с динамическим именем, это просто попытка ОП объяснить то, что у них не было надлежащей терминологии и опыта, чтобы правильно сформулировать. Правильный способ решить то, что они на самом деле пытались сделать, — это использовать списки и подобные структуры.

BambooleanLogic 12.08.2024 14:51

@Диего Нет, это не так. Лучший способ ответить на вопрос — это ответить на него по-настоящему. Этот ответ никогда не делает. В лучшем случае это не добавляет никакой новой ценности, потому что есть и другие вопросы и ответы о структурах данных в Java. В худшем случае он избегает темы, заданной в вопросе (ничего об именах переменных в цикле).

Chaosfire 12.08.2024 14:58

@Chaosfire принял ваше предложение в моем ответе. Я думаю, что это имеет смысл, и между этими двумя точками зрения можно достичь баланса. Ваше здоровье!

Diego 12.08.2024 15:36

@Chaosfire и Диего Огромное спасибо вам обоим за советы, честно говоря, я узнал больше о классах и объектах, чем часы видео и конспектов лекций. Теперь я понимаю, что на самом деле они используются просто для того, чтобы структурировать код, и для архивирования моей цели было бы намного проще использовать какую-нибудь коллекцию. Еще раз большое спасибо за помощь. Я очень ценю, что вы, ребята/девочки, нашли время, чтобы помочь мне. Спасибо

Jash2204 12.08.2024 19:41
Ответ принят как подходящий

Обычно вы не меняете имена динамических переменных. Я думаю, что это прежде всего концептуальная ошибка, а не проблема кодирования.

Java предоставляет несколько готовых структур данных, таких как карты, наборы и списки (это то, что вам нужно).

Вам не нужно создавать объект BookList. Вместо этого вам следует создать класс Book, а затем создать экземпляр List типа Book.

Я внес некоторые основные изменения в ваш код, включая некоторые дополнительные предложения:

  1. Список книг переименован в «Книга».

  2. Создал его экземпляр с помощью конструктора, который обеспечивает соблюдение всех параметров/зависимостей.

  3. Добавлен список, и теперь каждая новая книга добавляется в этот список после постройки.

  4. ДОПОЛНИТЕЛЬНО: для сканирования не нужно создавать по одному сканеру на строку. Я создал один сканер для всего экземпляра BookLibrary. (Сканеры не являются потокобезопасными, поэтому будьте осторожны с этим)

  5. TODO: добавьте цикл while, и каждый раз, когда вы добавляете книгу, увеличивайте счетчик, чтобы получить новый идентификатор.

    общественный класс BookLibrary { частный счетчик int = 1; частный список bookList = новый ArrayList<>(); частный сканер GeneralScanner = новый сканер (System.in);

     public static void main(String[] args) {
    
         final BookLibrary bookLibrary = new BookLibrary();
    
         System.out.println("Do you want to 1:Add a book or 2:Remove a book");
         int choice = bookLibrary.generalScanner.nextInt();
         if (choice == 1) {
             System.out.println("You want to add a book");
             bookLibrary.addBook();
         }
     }
    
     public void addBook() {
         System.out.println("Enter the Name of the book");
         String name = this.generalScanner.nextLine();
         System.out.println("Enter the Author of the book");
         String author = this.generalScanner.nextLine();
         final Book book = new Book(name, author, this.counter);
         bookList.add(book);
     }
    

    Класс книги

    публичный класс Книга { Строковое имя; Автор строки; INT bookNum;

         public Book(String name, String author, int bookNum) {
             this.name = name;
             this.author = author;
             this.bookNum = bookNum;
         }
    
         public void printLibrary() {
             System.out.println("Book name: " + name);
             System.out.println("Author: " + author);
             System.out.println("Book Number: " + bookNum);
         }
     }
    

Обновлено: Следуя предложению Chaosfire, чтобы динамически изменять переменные, вы можете использовать Reflection для изменения некоторых из них. Однако это антипаттерн по нескольким причинам:

  • Вы нарушите объектно-ориентированные шаблоны и сделаете свой код более сложным и подверженным ошибкам.
  • Java — это язык со строгой типизацией, а это означает, что динамическое изменение этого параметра приведет к нарушению типизации.
  • Отражения добавляют накладные расходы во время выполнения.

Огромное спасибо за привет, Диего. Если можно, я поинтересуюсь, какое реальное использование существует у классов и объектов. Я никогда по-настоящему не использовал их в своем предыдущем академическом опыте (Python), но меня «вынуждают» изучать их, поскольку это часть моей учебной программы, и через несколько дней я все еще не могу осознать это. Я как бы изучаю это только потому, что мне нужно это сделать на случай, если это всплывет на моем экзамене. Я вообще не понимаю, зачем они мне нужны.

Jash2204 12.08.2024 14:47

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

Diego 12.08.2024 14:51

Затем Пользователь также может содержать некоторые варианты поведения (методы), такие как вход в систему или добавление к нему роли. Роли сами по себе могут быть еще одним объектом, в котором вы описываете определенные свойства, такие как имя роли и ее разрешенные разрешения.

Diego 12.08.2024 14:56

Затем вы можете добавить поверх него еще один класс с именем UserManagementService, который может управлять созданием пользователя, например, с помощью сканера для запроса данных, затем создания пользователя, добавления к нему ролей и, наконец, сохранения его в базе данных. Взгляните на SOLID. Объекты — отличный способ избежать повторения и инкапсулировать логику там, где это необходимо, вместо того, чтобы засорять классы дополнительной ответственностью, создавая тем самым очень длинные файлы, которые невозможно читать и отслеживать.

Diego 12.08.2024 15:02

вы забываете увеличить свой счетчик. Зачем вам хранить экземпляр Book в переменной, почему бы не просто: bookList.add(new Book(name,author, this.counter)); ?

Stultuske 12.08.2024 15:07

@Chao1sfire Я понимаю твою точку зрения. Посмотрите мое последнее редактирование, если это имеет смысл! Ваше здоровье

Diego 12.08.2024 15:13

@Stultuske, ну, ОП сказал, что знает, что ему нужно добавить цикл while и увеличить счетчик. Я не стремился предоставить идеальный и законченный код. Это не цель. Тем не менее, я сказал, что это TODO

Diego 12.08.2024 15:35

Другие вопросы по теме