用HashMaps替换ArrayLists

时间:2014-12-13 12:08:18

标签: java object arraylist hashmap iteration

我目前正在开发一个项目,我用HashMaps替换代码中的ArrayLists,但我遇到了问题。在我的代码的这一部分中,我正在从我的书类中创建一个新的“书”,而在“获取书”部分则是我遇到问题的地方。我正在尝试检查(现在)HashMap书籍,以查看getId()方法中的书籍ID是否与书籍对象的bookID相匹配。我应该如何使用Book对象对HashMap进行迭代?

这是我的HashMap:HashMap<String, String> books = new HashMap<String, String>();

        if (users.containsValue(new User(userID, null, 0)) 
                && books.containsValue(new Book(bookID, null))) {
            // get the real user and book 
            Book b = null;
            User u = null;

        // get book
            for (Book book : books) {
                if (book.getId().equalsIgnoreCase(bookID)) {
                    b = book;
                    break;
                }
            }

2 个答案:

答案 0 :(得分:0)

您的Hashmap中只有字符串。 没有书。

由于HashMap中没有Books,您将永远无法从中获取Book对象。

如果要使用String对象识别Book对象,HashMap可以正常工作,但您必须以这种方式进行设置:

HashMap<String, Book> books = new HashMap<String, Book>();

以下是Hashmap如何与Book对象一起使用的完整工作示例:

import java.util.HashMap;

public class Book
{
    private String title;
    private int pages;

    public Book(String title, int pages)
    {
        this.title = title;
        this.pages = pages;
    }

    public String toString()
    {
        return title + ", " + pages + "p.";
    }

    public static void main(String[] args)
    {
        //creating some Book objects
        Book theGreatBook = new Book("The great Book of awesomeness", 219);
        Book klingonDictionary = new Book("Klingon - English, English - Klingon", 12);

        //the Map:
        HashMap<String, Book> library = new HashMap<String, Book>();

        //add the books to the library:
        library.put("ISBN 1", theGreatBook);
        library.put("ISBN 2", klingonDictionary);

        //retrieve a book by its ID:
        System.out.println(library.get("ISBN 2"));
    }
}

为什么使用字符串来识别对象? 字符串不是唯一的,因此如果两本书具有相同的ID,您将遇到问题。 我会将对象的ID作为数据字段添加到对象本身。 将ID与HashMap中的对象关联起作用,但非常失败。 没有地图,协会就消失了。 它也容易出错,因为编译器无法缓存字符串中的拼写错误。 也许你在运行时遇到了NullPointerException。

特别是因为你的User类也有这样一个“ID”,我想知道你是否将它添加到每个类中,并且想说确实没有必要这样做(除非你有其他原因)。 要标识对象,只需使用对象的引用。 如果您的某个变量名称中有一个引用对象的拼写错误,编译器就能告诉您。

答案 1 :(得分:0)

你可能需要这样的东西。我使用了名字而不是ID,但我希望你能得到漂移......

// setting up the test
HashMap<String, String> borrowers = new HashMap<String, String>();
borrowers.put("Lord of the Rings", "owlstead");
borrowers.put("The Hobbit", "sven");
borrowers.put("Vacuum Flowers", "owlstead");

// find out what I borrowed from the library

String userID = "owlstead";
List<String> booksBorrowed = new ArrayList<>();
 // iterating through the books may not be very efficient!
for (String bookName : borrowers.keySet()) {
    if (borrowers.get(bookName).equals(userID)) {
        booksBorrowed.add(bookName);
    }
}

// print instead of a return statement
System.out.println(booksBorrowed);