2014-12-13 4 views
0

В настоящее время я работаю над проектом, в котором я заменяю ArrayLists в своем коде HashMaps, и у меня возникла проблема. В этом разделе моего кода я создаю новую «Книгу» из своего книжного класса, а в разделе «Получить книгу» я столкнулся с проблемой. Я пытаюсь проверить (теперь) книги HashMap, чтобы узнать, соответствует ли идентификатор книги из метода getId() идентификатору bookID объекта книги. Как мне переходить на мой HashMap с помощью объекта Book?Замена ArrayLists с помощью HashMaps

Это мой 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

Что вы намерены вставить в HashMap? Каков ключ и какая ценность? – Eran

+0

Вы уверены, что вы правильно представляете свои книги 'HashMap' здесь? Какая информация содержится в книгах «HashMap»? 'books', похоже, не является ОК именем для объектов HashMap,' Map', которые должны использоваться для * отношений *, классов для композиции. –

+0

Ваши намерения не ясны. Если вы можете объяснить лучше, мы можем помочь. И в вашем коде 'books' является hashMap со строковым ключом, и вы пытаетесь совместить строковый ключ с объектом, который никогда не будет правдой. – Dileep

ответ

0

Есть только строк в вашем Hashmap. Нет книг.

Как нет книг в HashMap, вы никогда не сможете получить объект Book из него.

Если вы хотите, чтобы идентифицировать объекты книги с Струнные объектами, а Hashmap работает, но вы должны настроить его таким образом:

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

Вот полный рабочий пример того, как HashMap может быть использован с Объекты для книг:

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")); 
    } 
} 

Почему вы используете строки для идентификации объектов? Строки не уникальны, поэтому, если две книги имеют одинаковый идентификатор, вы столкнетесь с проблемами. Я бы добавил идентификатор объекта в качестве поля данных к самому объекту. Создание связи идентификатора с объектом в HashMap работает, но очень проигрывает. Без карты ассоциация ушла. Он также подвержен ошибкам, поскольку опечатки в ваших строках не могут быть кэшированы компилятором. Возможно, вы столкнетесь с NullPointerException во время выполнения.

Особенно потому, что у вашего класса User есть такой идентификатор. Мне интересно, добавляете ли вы это для каждого класса и хотите сказать, что на самом деле нет необходимости делать это (если у вас нет других причин). Чтобы идентифицировать объект, просто используйте ссылку на объект. Если у вас есть опечатка в одном из ваших имен переменных, ссылающихся на объект, компилятор сможет вам это рассказать.

0

Вам, вероятно, понадобится нечто подобное. Я использовал имена вместо идентификаторов, но надеюсь, что вы получите дрифт ...

// 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); 
Смежные вопросы