【问题标题】:Object creation with different name使用不同名称创建对象
【发布时间】:2013-05-26 08:47:27
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 只需使用java.util.List<Book> 并按索引获取参考。
  • 为什么要让用户命名你的内部变量?
  • 这个问题涉及到一些编程的基本概念。如果这是您正在学习的课程的一部分,我建议您将其告知您的讲师,以便他们考虑调整课程计划。
  • 谢谢@nathaniel-waisbrot 但我没有任何导师。我只是在看一些教程并尝试学习一些东西。

标签: java


【解决方案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);
}

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

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

for (Book book : books) {
    // do stuff with book, e.g. print its title
    System.our.println(book.getTitle());
}

【讨论】:

    【解决方案2】:

    只需将它们存储在HashMap&lt;String,Book&gt; 中,并使用图书名称作为您的密钥。这样按标题取书就变得容易了

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

    创建地图

    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 类型可供选择,可以在 in the tutorial 找到对所提供“子系列”的快速介绍。现在,因为我假设您希望通过用户输入的属性来搜索您存储的项目,所以我建议使用地图,使用书名作为关键字。当然,您可以选择一个列表,但在列表中,项目被编号,按标题搜索将迫使您遍历列表并检查每个存储项目的标题,直到找到正确的书。在许多情况下,这不是很有效,并且会迫使您编写更多代码。

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

    【讨论】:

    • 提供更多代码来展示您的示例。看起来 OP 不知道如何处理。
    • @LuiggiMendoza 好的,等一下
    • 我认为 OP 不知道集合(非常好)。
    • @JimmyT 那么这是了解它们的最佳时机 :-) 不认真,我认为掌握集合非常重要,可以尽快了解它们,尤其是如果它们可以帮助您解决问题快速而优雅地解决您遇到的问题。
    • 我认为 OP 正在尝试创建新变量或者为什么要将它们称为 book1 等等?
    【解决方案3】:

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

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

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

    【讨论】:

    • 好的。这开始解决我的问题。在回复/cmets 的某处读到引用的名称无关紧要。但我认为类方法是通过对象访问的。如果我写类似 book1.getName();我可以通过对象的“book1”引用调用该信息,对吗?如果所有对象都称为“book1”,程序如何知道如何返回正确的书?
    • 只需将每本书添加到收藏中,然后再请求下一本。一旦所有书籍都在集合中,您就可以实现搜索算法来检索一本特定的书籍。
    • @Toscano 就你而言,你是正确的。此外,book1 每次引用 一个 Book 对象,因此当您执行 book1.getName() 时,您将调用 getName() 方法,无论 Book book1 引用 就在那一刻。当您创建新的 Book 对象 (book1= new Book(...);) 时,后续调用将定向到新对象。正如这个答案和其他人所建议的那样,您应该查看 Collections 框架。这些内置类为在程序中存储多个对象提供了非常有用的方法。
    • 谢谢,@code-guru 这很有帮助。我会看看那些收藏。
    【解决方案4】:

    您不能将其命名为 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 中获得一本书。

    【讨论】:

    • 那么仅仅使用这行代码就能神奇的解决所有问题?
    • 所以首先你展示了如何使用ArrayList 但放弃这个解决方案并更喜欢使用你自己的手动数组?很抱歉给您带来麻烦,但这确实不是一个合适的好解决方案。它可以解决它的事实并不意味着解决方案设计得很好。
    • 如果 downvoter 让我知道我错过了什么或错了什么,那么 Downvote 很棒!让大家学习!
    【解决方案5】:

    引用的名称无关紧要。

    你可以这样做:

    while reading user input {
        Book book = new Book(bookName, etc.,);
        storeTheBook(book);
    }
    
    private void storeTheBook(Book book) {
        // Store it wherever you want.
    }
    

    【讨论】:

    • 这实际上没有比问题更多的信息。
    猜你喜欢
    • 2016-11-22
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多