Я новичок в 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);
}
}
В вашем курсе должны быть закрытые циклы (включая переменные в циклах), если у вас есть такие упражнения. если это не так, то уроки от oracle — хорошее место для начала.
Ключевая концепция, которую вам не хватает, — это коллекция, такая как список или массив. (В 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: Jash2204: Когда вы новичок, классы и объекты могут показаться слишком сложными, а пользы от этого мало. Это часто справедливо, когда вы имеете дело с крошечными проектами, которые вы выполняете на ранних курсах программирования; их часто можно решить, не беспокоясь об этом. Однако как только вы начнете работать с реальными проектами (или фактически начнете работать над большими системами), классы и объекты быстро станут неоценимыми в качестве инструмента для организации сложных фрагментов кода и данных в более простые для понимания и обслуживания блоки.
@Chaosfire ну да, мы знаем. Но он новичок в этом языке, и, исходя из Python, мы понимаем это заблуждение. Мы не роботы, и лучший способ ответить на этот вопрос — объяснить концепции.
@Chaosfire: Я считаю, что это проблема XY. На самом деле вопрос не в том, как иметь переменные с динамическим именем, это просто попытка ОП объяснить то, что у них не было надлежащей терминологии и опыта, чтобы правильно сформулировать. Правильный способ решить то, что они на самом деле пытались сделать, — это использовать списки и подобные структуры.
@Диего Нет, это не так. Лучший способ ответить на вопрос — это ответить на него по-настоящему. Этот ответ никогда не делает. В лучшем случае это не добавляет никакой новой ценности, потому что есть и другие вопросы и ответы о структурах данных в Java. В худшем случае он избегает темы, заданной в вопросе (ничего об именах переменных в цикле).
@Chaosfire принял ваше предложение в моем ответе. Я думаю, что это имеет смысл, и между этими двумя точками зрения можно достичь баланса. Ваше здоровье!
@Chaosfire и Диего Огромное спасибо вам обоим за советы, честно говоря, я узнал больше о классах и объектах, чем часы видео и конспектов лекций. Теперь я понимаю, что на самом деле они используются просто для того, чтобы структурировать код, и для архивирования моей цели было бы намного проще использовать какую-нибудь коллекцию. Еще раз большое спасибо за помощь. Я очень ценю, что вы, ребята/девочки, нашли время, чтобы помочь мне. Спасибо
Обычно вы не меняете имена динамических переменных. Я думаю, что это прежде всего концептуальная ошибка, а не проблема кодирования.
Java предоставляет несколько готовых структур данных, таких как карты, наборы и списки (это то, что вам нужно).
Вам не нужно создавать объект BookList. Вместо этого вам следует создать класс Book, а затем создать экземпляр List типа Book.
Я внес некоторые основные изменения в ваш код, включая некоторые дополнительные предложения:
Список книг переименован в «Книга».
Создал его экземпляр с помощью конструктора, который обеспечивает соблюдение всех параметров/зависимостей.
Добавлен список, и теперь каждая новая книга добавляется в этот список после постройки.
ДОПОЛНИТЕЛЬНО: для сканирования не нужно создавать по одному сканеру на строку. Я создал один сканер для всего экземпляра BookLibrary. (Сканеры не являются потокобезопасными, поэтому будьте осторожны с этим)
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 для изменения некоторых из них. Однако это антипаттерн по нескольким причинам:
Огромное спасибо за привет, Диего. Если можно, я поинтересуюсь, какое реальное использование существует у классов и объектов. Я никогда по-настоящему не использовал их в своем предыдущем академическом опыте (Python), но меня «вынуждают» изучать их, поскольку это часть моей учебной программы, и через несколько дней я все еще не могу осознать это. Я как бы изучаю это только потому, что мне нужно это сделать на случай, если это всплывет на моем экзамене. Я вообще не понимаю, зачем они мне нужны.
Объекты — это простой способ управления/моделирования/структурирования кода. Вместо того, чтобы создавать один класс-спагетти со всем вашим кодом, вы пытаетесь разбить функциональность, описывая ее как объекты и поведения. Так, например, если вы хотите реализовать реалистичный вариант использования службы администрирования пользователей, вы моделируете ее, создавая класс User, содержащий ее свойства.
Затем Пользователь также может содержать некоторые варианты поведения (методы), такие как вход в систему или добавление к нему роли. Роли сами по себе могут быть еще одним объектом, в котором вы описываете определенные свойства, такие как имя роли и ее разрешенные разрешения.
Затем вы можете добавить поверх него еще один класс с именем UserManagementService, который может управлять созданием пользователя, например, с помощью сканера для запроса данных, затем создания пользователя, добавления к нему ролей и, наконец, сохранения его в базе данных. Взгляните на SOLID. Объекты — отличный способ избежать повторения и инкапсулировать логику там, где это необходимо, вместо того, чтобы засорять классы дополнительной ответственностью, создавая тем самым очень длинные файлы, которые невозможно читать и отслеживать.
вы забываете увеличить свой счетчик. Зачем вам хранить экземпляр Book в переменной, почему бы не просто: bookList.add(new Book(name,author, this.counter)); ?
@Chao1sfire Я понимаю твою точку зрения. Посмотрите мое последнее редактирование, если это имеет смысл! Ваше здоровье
@Stultuske, ну, ОП сказал, что знает, что ему нужно добавить цикл while и увеличить счетчик. Я не стремился предоставить идеальный и законченный код. Это не цель. Тем не менее, я сказал, что это TODO
Почему бы сначала не попробовать добавить свой цикл и посмотреть, что из этого получится? Кто знает, вы вполне можете приятно удивить себя, и даже если вы этого не сделаете, включение попытки и конкретный вопрос о ваших трудностях с попыткой, скорее всего, приведет к лучшему вопросу и к большему обучению с вашей стороны.