假设我正在建立一个图书馆类来跟踪我的图书购买情况。 我会编写类似下面的内容来帮助我创建书籍对象(不要过多关注细节。这段代码只是为了说明我的问题):
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等,或用户选择的其他名称?
感谢。
答案 0 :(得分:3)
只需将它们存储在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 method:
完成for (String title : bookMap.keySet()) {
...
}
Oracle tutorial on Collections是一个开始学习更多知识的好地方,收藏在几乎所有课程中都非常重要,学习利用它们的所有可能性非常有用。
编辑:只是为了澄清一点,我想指出你的答案:Java不允许你动态创建对象的名称(标识符不能在运行时突然弹出)。如果要动态创建和保留(存储)对象,可以使用Java提供的一种Collection类型。标准API中有各种各样的Collection类型,可以找到所提供的“subfamilies”的快速介绍in the tutorial。现在,因为我假设你想要按用户输入的属性搜索你存储的项目,我建议使用一个Map,使用书的标题作为键。当然你可以选择一个List,但是在List项中有编号,按标题搜索会强制你遍历List并检查每个存储项的标题,直到找到正确的书。在许多情况下,效率不高,它会迫使您编写更多代码。
这并不意味着您应该将HashMap用于所有内容。恰恰相反,您需要了解所有提供的接口的优点和缺点,以便能够编写最佳代码。我希望我的帖子能指出你正确的方向。
答案 1 :(得分:2)
每次使用new
关键字创建对象时,您都会有一本新书替换之前的关键字。在创建新的之前,请务必保存上一个。
您可以查看其他答案,了解如何在程序中使用Collections
,这是Java中非常重要的功能。无论如何,当你退出程序时,你将丢失所有信息,因为集合将信息保存在内存中,内存将被完全清除。您需要一个持久存储来将信息从一个执行保存到另一个。例如,持久存储是文件或数据库。
尝试使用第一个收藏集来存储和打印书籍列表。然后,您将实现一个持久存储,将它们保存在磁盘上,以便在停止并重新启动程序后能够检索它们。
答案 2 :(得分:1)
你不能将它命名为Book1,Book2,......但你可能会使用一系列书籍对象,但这会限制你的大小。将它用作Book [index]
Book[] books = new Book[10];
for(i=0;i<10;i++)
books[i] = new Book( ... ); //process book object
也许你可以保留Book的Arraylist。
ArrayList<Book> books = new ArrayList<>();
arraylist更灵活。
你可以添加对象
books.add(new Book(...));
使用迭代器或索引访问图书
books.get(index); //more better than Book1,Book2, ...
你从Books获得了一本书。
答案 3 :(得分: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
语句退出循环,如“退出”。
之后,您可以使用另一个循环来搜索和访问存储在该列表中的书籍:
for (Book book : books) {
// do stuff with book, e.g. print its title
System.our.println(book.getTitle());
}
答案 4 :(得分:0)
引用的名称无关紧要。
你可以这样做:
while reading user input {
Book book = new Book(bookName, etc.,);
storeTheBook(book);
}
private void storeTheBook(Book book) {
// Store it wherever you want.
}