【问题标题】:How to Iterate a arraylist of objects to find a specified object如何迭代对象的arraylist以查找指定的对象
【发布时间】:2014-04-09 19:24:31
【问题描述】:

我无法理解和使我的程序的此功能正常工作。我正在创建一个库,我首先将多个对象输入到数组列表中。对象由媒体的标题和格式组成。我需要能够搜索我的数组列表中的对象以找到特定对象并将该对象标记为“已签出”。我一直在研究迭代器并试图了解如何让它们在对象中找到指定的标题,但我遇到了麻烦。当我尝试 println(it.next()); 时,我得到 MediaItem@3c4568f8;所以我知道返回正确格式的信息存在问题。任何有关如何在我的项目数组列表中搜索对象的帮助将不胜感激。

import java.util.Iterator;
import java.util.Scanner;
import java.util.ArrayList;

public class Library {

    static ArrayList<MediaItem> items = new ArrayList<MediaItem>();
    static int menuOption;
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {
        String title, format, loanedTo, dateLoaned;
        boolean right = false;

        do {
            displayMenu();
            if (menuOption == 1) {
                System.out.println("Enter Title: ");
                title = scan.next();
                System.out.println("Enter format: ");
                format = scan.next();
                addNewItem(title, format);
            } else if (menuOption == 2) {
                System.out.println("Enter the item title");
                title = scan.next();
                System.out.println("Who are you loaning it to?");
                loanedTo = scan.next();
                System.out.println("When did you loan it to them?");
                dateLoaned = scan.next();
                markItemOnLoan(title, loanedTo, dateLoaned);
            } else if (menuOption == 3) {
                for (MediaItem mi : items) {
                    System.out.println(mi.getTitle() + ", " + mi.getFormat());
                }
            } else if (menuOption == 4) {

            } else {
                System.exit(1);
            }

        } while (!right);
    }

    static int displayMenu() {
        boolean right = false;

        do {

            System.out.println("Menu: ");
            System.out.println("1. Add New Item");
            System.out.println("2. Mark an item as on loan");
            System.out.println("3. List all items");
            System.out.println("4. Mark an item as returned");
            System.out.println("5. Quit");
            menuOption = scan.nextInt();

            if (menuOption < 1 || menuOption > 5) {
                System.out.println("Invalid Number!");
            }

            return menuOption;
        } while (!right);
    }

    static void addNewItem(String title, String format) {
        MediaItem b = new MediaItem();
        b.setTitle(title);
        b.setFormat(format);
        items.add(b);

    }

    static void markItemOnLoan(String title, String name, String date) {
        Iterator<MediaItem> it = items.iterator();
        System.out.println(it.next());
    }

}





public class MediaItem {

String title;
    String format;
    boolean onLoan;
    String loanedTo;
    String dateLoaned;

    MediaItem() {
        title = null;
        format = null;
        onLoan = false;
        loanedTo = null;
        dateLoaned = null;

    }

    MediaItem(String title, String format) {
        title = new String();
        format = new String();

    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public boolean isOnLoan() {
        return onLoan;
    }

    public void setOnLoan(boolean onLoan) {
        this.onLoan = onLoan;
    }

    public String getLoanedTo() {
        return loanedTo;
    }

    public void setLoanedTo(String loanedTo) {
        this.loanedTo = loanedTo;
    }

    public String getDateLoaned() {
        return dateLoaned;
    }

    public void setDateLoaned(String dateLoaned) {
        this.dateLoaned = dateLoaned;
    }

    void markOnLoan(String name, String date) {
        onLoan = true;
    }

    void markReturned() {
        onLoan = false;
    }
}

【问题讨论】:

  • 您的对象没有toString() 方法,因此它将对象引用作为字符串返回。换句话说,它调用的是Object.toString() 而不是MediaItem.toString()(它不存在)。
  • Printing reference to an object 的可能重复项
  • 我同意的第一部分是重复的,但我也想知道如何在对象中搜索标题。

标签: java object arraylist iterator


【解决方案1】:

MediaItem@3c4568f8 输出是Object's toString() method 的结果。

[T]他的方法返回一个等于值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

您还没有在Media 中覆盖toString(),所以它继承了Object 的方法。

覆盖toString(),在将对象传递给System.out.println 并在Object 上调用toString() 时返回要打印的字符串。

【讨论】:

  • 谢谢!我现在可以看到 it.next() 了。现在我只需要弄清楚如何搜索特定的标题,是时候做更多的研究了。
【解决方案2】:

您应该实现一个 toString() 方法,该方法将返回类似标题的内容,而不是对象引用。此外,您可以实现一个比较器来准确确定对象是否匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多