3
respostas

Duvidas com MAP, HashMap

Ola, estou tentando resolver uma lista de exercícios e estou me deparando com alguns erros que não sei muito bem como arrumar.

O inicio da classe pedia para inicializar "theMap " no construtor e imagino que fiz corretamente.

public class MapAuthorshipTracker implements AuthorshipTracker {

    /* DO NOT MODIFY THIS */
    private Map<Author, Set<Book>> theMap;
    /* DO NOT ADD MORE ATTRIBUTES */

    public MapAuthorshipTracker() {
        /* COMPLETE */
        this.theMap = new HashMap<>();
    }

Logo tenho o primeiro método que é adicionar os livros a seus autores e tentei aqui somente colocar uma linha para ver se estava correto pois tinha visto método put que pede uma key no caso um autor e seus valores que seriam os livros.

@Override
    public int addBooksToAuthor(Author author, Collection<Book> books) {
        /*
         * Binds the given author with the books in the second argument. Books already
         * bound to the author are not bound again. Returns the number of books
         * effectively bound to the author.
         */

        theMap.put(author, (Set<Book>) books);//aqui esta marcado o erro de cast

        return 0;
    }

Mas quando vou rodar tenho esse erro:

        java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.Set

Agradeço qualquer ajuda.

3 respostas

Oi Gabriel,

Você não mandou o código que chama o método addBooksToAuthor, porém o erro é que nessa chamada ao método addBooksToAuthor está sendo passado um ArrayList para o parâmetro books. Não dá para fazer um cast direto de ArrayList para Set, são tipos diferentes.

Faz o seguinte:

theMap.put(author, new HashSet<Book>(books));

Abraço!

Olá Otávio. Sim, na verdade vem de uma interface o método addBooksToAuthor agora a tarde eu fiquei dando uma olhada e acho que estou quase lá.

Está assim o código agora:

@Override
    public int addBooksToAuthor(Author author, Collection<Book> books) {
        /*
         * Binds the given author with the books in the second argument. Books already
         * bound to the author are not bound again. Returns the number of books
         * effectively bound to the author.
         */

        int cont = 0;
        Set<Book> setBook = new HashSet<Book>(books);
        //System.out.println(setBook);
        for (Book book : setBook) {
            if (!theMap.containsValue(setBook.contains(book))) {
                theMap.put(author, setBook);            
                cont++;
            }

        }
        System.out.println(theMap);
        System.out.println(cont);
        return cont;
    }

Ainda não consegui entender muito bem como fazer a parte da logica aqui. Tenho que adicionar os livros a cada autor e fazer ele mostrar o numero de livros adicionados a cada autor no final.

Está "estranha" esta implementação.

Veja que você acabou de criar o objeto "setBook":Set<Book> setBook = new HashSet<Book>(books);

e na pórxima linha você já está tentando iterar sobre ele. Ou seja, seu for não será executado.

Creio que a implementação que você quer é:

  1. Inserir no mapa os livros e o autor:

Simplesmente use: theMap.put(author, setBook); Como é um HashSet, a api por si só já garantirá que não haverá valores repetidos.

  1. Para mostrar o número de livros de casa autor, faça o seguinte:

for (Map.Entry<Author,Books> mapa: theMap.entrySet()) { Books livros = mapa.getValue(); System.out.println( livros.size()); }