使用不同名称创建对象

时间:2013-05-30 16:57:23

标签: java

假设我正在建立一个图书馆类来跟踪我的图书购买情况。 我会编写类似下面的内容来帮助我创建书籍对象(不要过多关注细节。这段代码只是为了说明我的问题):

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等,或用户选择的其他名称?

感谢。

5 个答案:

答案 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.
}