0

假设我正在构建一个图书馆类来跟踪我的图书购买情况。我会编写如下代码来帮助我创建书籍对象(不要太在意细节。这段代码只是为了说明我的问题):

public class MyLibrary {

 String bookName = "";
 String bookAuthor = "";
 double purchasePrice = 0.00;
 int printYear = 0;

  public Book(String name, String author, double price, int year) {

   this.bookName = name;
   this.bookAuthor = author;
   this.purchasePrice = price;
   this.printYear = year;
  }    
 }

然后我正在考虑在程序的 main() 部分中使用 Scanner 对象来帮助我引入数据和创建书籍对象。就像是:

Scanner input = new Scanner(System.in);
System.out.println("Give a book name, please: ");
String bookName = input.next();
.
. (repeat for every other argument)
.
Book book1 = new Book(bookName, etc.,);

现在,我直接在代码中创建了这个特定的对象 - book1。但是,如果我让用户创建新书,程序如何创建具有不同名称/引用的对象?

换句话说,我如何确保用户创建的新对象将被依次称为 book1、book2、book3 等或用户选择的其他名称?

谢谢。

4

5 回答 5

3

只需将它们存储在 a 中HashMap<String,Book>并使用 Book 的名称作为您的密钥。这样按标题取书变得容易

以下是您需要的不同步骤:

创建地图

Map <String,Book> bookMap = new HashMap<String,Book>();

向地图添加一本书:

String bookName = input.next();
Book book1 = new Book(bookName, etc.,);
bookMap.put(bookName,book1);

然后按标题将书从地图中取出:

Book foundBook = bookMap.get(bookName);

可以通过keySet 方法获取存储在地图中的书籍列表:

for (String title : bookMap.keySet()) {
    ...
}

Oracle 集合教程是开始学习更多知识的好地方,集合在几乎所有程序中都非常重要,学习利用它们的所有可能性非常有用。

编辑:只是为了澄清我想用我的答案指出你的地方:Java 不允许你为对象动态创建名称(标识符在运行时不能突然弹出)。当您想要动态地创建和保存(存储)对象时,您可以使用 Java 提供的 Collection 类型之一。标准 API 中有多种集合类型可供选择,可以在教程中找到对所提供“子系列”的快速介绍. 现在,因为我假设您希望通过用户输入的属性来搜索您存储的项目,所以我建议使用地图,使用书名作为关键字。当然,您可以选择一个列表,但在列表中,项目被编号,按标题搜索将迫使您遍历列表并检查每个存储项目的标题,直到找到正确的书。在许多情况下,这不是很有效,它会迫使您编写更多代码。

这并不意味着您应该对所有内容都使用 HashMap 。恰恰相反,您需要了解所有提供的接口的优缺点才能编写最佳代码。我希望我的帖子为您指明了正确的方向。

于 2013-05-30T17:00:35.877 回答
2

每次使用new关键字创建对象时,您都会有一本新书来取代之前的书。请务必在创建新的之前保存前一个。

您可以查看其他答案以了解如何Collections在您的程序中使用,这是 Java 中非常重要的功能。无论如何,当您退出程序时,您将丢失所有信息,因为集合将信息保存在内存中,并且内存将被彻底清除。您将需要一个持久存储来将信息从一个执行保存到另一个执行。例如,持久存储是文件或数据库。

只需尝试使用第一个 Collections 来存储和打印书籍列表。然后,您将实现一个持久存储以将它们保存在磁盘上,以便在停止并重新启动程序后能够检索它们。

于 2013-05-30T17:01:22.193 回答
1

您不能将其命名为 Book1,Book2,... 但您可以使用书籍对象数组,但这会限制您的大小。用它作为书[索引]

Book[] books = new Book[10];
for(i=0;i<10;i++)
    books[i] = new Book( ... ); //process book object

也许你可以保留 Arraylist of Book。

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

arraylist 更灵活。

你可以添加对象

 books.add(new Book(...));

使用迭代器或索引访问书籍

 books.get(index);  //more better than Book1,Book2, ... 

你从 Books 中得到一本书。

于 2013-05-30T17:02:38.243 回答
1

您需要两件事:一个循环和一个列表(或另一种集合),例如:

List<Book> books = new ArrayList<Book>();
Scanner input = new Scanner(System.in);
while (true) {
    // ... ask title, author, etc.
    Book book = new Book(bookName, etc.,);
    books.add(book);
}

请注意,这将在无限循环中运行。您还需要添加一些退出条件。在进入循环之前询问用户要添加多少本书,或者break在用户输入一些特殊关键字(如“exit”)后使用语句退出循环。

之后,您可以使用另一个循环来搜索和访问存储在该列表中的书籍:

for (Book book : books) {
    // do stuff with book, e.g. print its title
    System.our.println(book.getTitle());
}
于 2013-05-30T17:09:28.577 回答
0

引用的名称无关紧要。

你可以这样做:

while reading user input {
    Book book = new Book(bookName, etc.,);
    storeTheBook(book);
}

private void storeTheBook(Book book) {
    // Store it wherever you want.
}
于 2013-05-30T17:00:27.577 回答