我目前正在开发一个项目,我用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;
}
}
答案 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);