Problemas com ArrayList

18 respostas
kxmm

Sou iniciante em Java e recebi o seguinte exercício:

Implemente em Java um sistema para controle de sua biblioteca pessoal. O
sistema é formado pelas classes ?Livro? e ?Biblioteca? com as características
descritas abaixo:
Classe: Livro
# Atributos: titulo (título do livro, tipo String), autores (autores do livro, tipo
String) e editora (editora que publicou o livro, tipo String). Todos atributos
privados;
# Método construtor para inicializar os atributos;
# Métodos get para obter cada um dos atributos;
# Métodos set para alterar cada um dos atributos.
Classe: Biblioteca
# Atributos: livros (lista de livros da biblioteca, tipo arrayList), numLivros
(número de livros inseridos na lista, tipo int) e MAXLIV (número máximo de
livros na lista, constante do tipo int com valor 50);
# Método para adicionar um livro na lista. Parâmetros: titulo, autores e editora;
# Método para adicionar um livro na lista. Parâmetro: objeto do tipo Livro;
# Método para excluir um livro da lista. Parâmetro: título do livro;
# Método para excluir um livro da lista. Parâmetro: objeto do tipo Livro;
# Método para retornar o livro cujo título é recebido como parâmetro. Retorna
nulo se o livro não existir. Parâmetro: título do livro;
# Método para retornar a lista de livros.
# Método para retornar o número de livros da biblioteca.

# Método main para executar as seguintes ações, usando todos os métodos
definidos nas classes:
# Criar um objeto do tipo Biblioteca;
# Adicionar quatro livros à biblioteca;
# Imprimir os dados de um livro da biblioteca dado seu título, ou uma mensagem de erro se o livro não existir;
# Imprimir a relação de todos os livros da biblioteca;
# Excluir dois livros da biblioteca.

Eis então a minha classe Livro

package bibliotecapessoal;

public class Livro {
  private String titulo, autores, editora;

    public Livro(String titulo, String autores, String editora) {
        this.titulo = titulo;
        this.autores = autores;
        this.editora = editora; }
   
    public String getTitulo(){
        return titulo; }
 
    public String getAutores(){
        return autores; }
   
    public String getEditora(){
        return editora; }
   
    public void setTitulo(String titulo){
        this.titulo=titulo; }
   
    public void setAutores(String autores){
        this.autores=autores; }
   
    public void setEditora(String editora){
        this.editora=editora; }
    }

Agora parte da classe Biblioteca:

package bibliotecapessoal;
import java.util.ArrayList;
        
public class Biblioteca {
    
    public Biblioteca (){
        int numLivros;
        final int MAXLIV = 50 ;
        ArrayList<Livro> livros = new ArrayList<Livro>(MAXLIV); }
    
    public void addLivro(String titulo, String autores, String editora){
        Livro livro1 = new Livro(titulo,autores,editora);
        addLivro2(livro1); }
    
    public void addLivro2(Livro liv){
        livros.add(liv); }

Eu não estou sabendo como adicionar um elemento na arrayList. Creio que porque o tipo de elemento (Livro) está na outra classe.
Enfim, me embaralhei todo nesse final. Alguém pode dar uma ajuda?

18 Respostas

cpsilva

Bom Dia kxmm, cara acabamos de resolver um problema parecido com o seu… eu alias, postei um source bem parecido com o seu…

http://www.guj.com.br/java/270019-duvida-em-arraylist#1415702

kxmm
cpsilva:
Bom Dia kxmm, cara acabamos de resolver um problema parecido com o seu... eu alias, postei um source bem parecido com o seu......

[url]http://www.guj.com.br/java/270019-duvida-em-arraylist#1415702[/url]

Primeiramente, obrigado por ajudar. Bom, vi sua resposta no outro tópico:

package br.com.array;  
    import java.util.ArrayList;  
    public class Principal {      
        public static void main(String args[]){       
            ArrayList<Pessoa> listaDosCabras = new ArrayList<Pessoa>();       
            Pessoa p = new Pessoa("Nome do Fulano", 21);  
            listaDosCabras.add(p);        
            System.out.println("Segue elemento 0:" + listaDosCabras.get(0).getNome());    
        }  
    }

Você chama um construtor pra p antes de adicionar na lista, certo?
Bom, então o meu era pra funcionar assim:

package bibliotecapessoal;
import java.util.ArrayList;
        
public class Biblioteca {
    
    public Biblioteca (){
        int numLivros;
        final int MAXLIV = 50 ;
        ArrayList livros = new ArrayList(MAXLIV); }
    
    public void addLivro(String titulo, String autores, String editora){
        Livro livro1 = new Livro(titulo,autores,editora);
        livros.add(livro1); }

Ou não é isso? Aqui não deu certo assim também.

F

Qual erro tá dando?

kxmm
felipeaps:
Qual erro tá dando?
O erro era nesta linha:
livros.add(livro1); }

Um amigo meu me disse para fazer da seguinte forma (parece ter funcionado):

package bibliotecapessoal;
import java.util.ArrayList;
        
public class Biblioteca {
    
    int numLivros;
    public final int MAXLIV = 50;
    ArrayList<Livro> livros;

    public Biblioteca (){
       numLivros = 0;
       livros = new ArrayList<Livro>(MAXLIV); }
    
    
    public void addLivro(String titulo, String autores, String editora){
        Livro livro = new Livro(titulo,autores,editora);
        livros.add(livro); }
    
    public void addLivro(Livro livro){
        livros.add(livro); }

Agora estou com dúvida de como fazer para remover um livro passando por parâmetro o título do livro.

F

Você entendeu o por que estava dando errado?

Você estava criando o Array dentro do seu construtor, ou seja, um objeto local ao método. Por isso não conseguia usá-lo no outro método.

Para deletar basta ir percorrendo o Array e usar o método getTitulo.

Algo do tipo:

for (int i = 0; i < livros.size(); i++) { if (livros.get(i).getTitulo.equals(tituloARemover)) { livros.remove(i); } }

kxmm

felipeaps:
Você entendeu o por que estava dando errado?

Você estava criando o Array dentro do seu construtor, ou seja, um objeto local ao método. Por isso não conseguia usá-lo no outro método.

Para deletar basta ir percorrendo o Array e usar o método getTitulo.

Algo do tipo:

for (int i = 0; i < livros.size(); i++) { if (livros.get(i).getTitulo.equals(tituloARemover)) { livros.remove(i); } }

Entendi agora com sua explicação. Deu certo aqui agora. Vou tentar implementar o resto do programa. Se tiver problemas volto aqui.
Muito obrigado. Todos me ajudaram bastante. É bom ver pessoas assim.

kxmm

Pessoal, a minha classe Biblioteca por fim ficou assim:

package bibliotecapessoal;
import java.util.ArrayList;
        
public class Biblioteca {
    
    int numLivros;
    public final int MAXLIV = 50;
    ArrayList<Livro> livros;

    public Biblioteca (){
       numLivros = 0;
       livros = new ArrayList<Livro>(MAXLIV); }
    
    
    public void addLivro(String titulo, String autores, String editora){
        Livro livro = new Livro(titulo,autores,editora);
        livros.add(livro); }
    
    public void addLivro(Livro livro){
        livros.add(livro); }   
    
    public void remover(String titulo){
        for (int i = 0; i < livros.size(); i++) {  
          if (livros.get(i).getTitulo().equals(titulo)) {  
            livros.remove(i); } } }

    public void remover(Livro livro){
        livros.remove(livro); }
        
    public Livro retornaLivro(String titulo){
        for (int i = 0; i < livros.size(); i++) {  
          if (livros.get(i).getTitulo().equals(titulo))   
            return livros.get(i); 
            break;}
            return null;} 
    
    public ArrayList retornaLista (){
        return (livros); }
    
    public int retornaNumLivros(){
        numLivros=livros.size();
        return numLivros; }
    
    
    public static void main(String[] args) {
        
        Biblioteca bib1 = new Biblioteca();
        Livro livro1 = new Livro("O Último Reino","BERNARD CORNWELL","Record");
        Livro livro2 = new Livro("O Buraco da Agulha","KEN FOLLETT & ORLANDO LEMOS ","Bestbolso");
        Livro livro3 = new Livro("A Colina das Bruxas","Marion Zimmer","Difel");
        Livro livro4 = new Livro("O Relojoeiro Cego","RICHARD DAWKINS","Companhia das Letras");
        
        bib1.addLivro(livro1);
        bib1.addLivro(livro2);
        bib1.addLivro("A Colina das Bruxas","Marion Zimmer","Difel");
        bib1.addLivro("O Relojoeiro Cego","RICHARD DAWKINS","Companhia das Letras");
        
        System.out.println(bib1.retornaLivro("O Buraco da Agulha"));
        System.out.println(bib1.retornaLivro("As Últimas Quatro Coisas"));
        System.out.println(bib1.retornaLista());
        bib1.remover(livro1);
        bib1.remover("A Colina das Bruxas");
        System.out.println(bib1.retornaNumLivros());
        
    }
   
}

Mas os métodos retornaLista e retornaLivro estão defeituosos. Como eu poderia corrigir isso?
Teria como iniciar o retorno com null e colocar um break se achar o livro na ArrayList?

public Livro retornaLivro(String titulo){
        return null;
        for (int i = 0; i < livros.size(); i++) {  
          if (livros.get(i).getTitulo().equals(titulo)){   
            return livros.get(i);
            break }}}

Algo assim. Mas esse está errado.

Andersonrms

Tira o break da linha 34. Ele é desnecessário, pois quando vc dá o comando return, nada mais no método é executado. Portanto dá erro d compilação, pois essa linha é inalcançável.
E na linha linha 38 tira os parênteses de livros.

kxmm

Andersonrms:
Tira o break da linha 34. Ele é desnecessário, pois quando vc dá o comando return, nada mais no método é executado. Portanto dá erro d compilação, pois essa linha é inalcançável.
E na linha linha 38 tira os parênteses de livros.

Ah sim, pensei que ele ficar entrando no looping e retornando. O problema com o break foi resolvido, tá retornando certinho agora.
Quanto a retirar o parêntese não fez diferença. O método tá retornando bibliotecapessoal.Livro@addbf1 ao invés de retornar as informações do livro, assim como o método retornaLista.

kxmm

Pessoal, além desse erro de retorno terei que resolver o próximo exercício (que é uma continuação desse):

Na classe Livro, crie uma lista de autores ao invés de armazenar todos os

autores em uma única string. Também modifique a informação sobre a editora
que publicou o livro, passando agora a ter os seguintes dados sobre cada
editora: CNPJ, nome, endereço e telefone;

Crie uma classe de interface com o usuário com opções para cadastrar e

excluir livros (e editoras) de uma biblioteca, pesquisar por um livro imprimindo
seus dados e imprimir a relação de todos os livros.

Estou tentando implementar aqui, depois posto para eventuais correções.

Obrigado.

Andersonrms

Tá imprimindo o nome q a JVM dá para cada objeto. Para vc imprimir as informações do livro, basta vc usar os métodos get da classe Livro, a partir do objeto livro q foi retornado do método. E no caso da lista, vc tem q usar um laço de repetição para passar por cada objeto da lista.

kxmm

Andersonrms:
kxmm:

Ah sim, pensei que ele ficar entrando no looping e retornando. O problema com o break foi resolvido, tá retornando certinho agora.
Quanto a retirar o parêntese não fez diferença. O método tá retornando bibliotecapessoal.Livro@addbf1 ao invés de retornar as informações do livro, assim como o método retornaLista.

Tá imprimindo o nome q a JVM dá para cada objeto. Para vc imprimir as informações do livro, basta vc usar os métodos get da classe Livro, a partir do objeto livro q foi retornado do método. E no caso da lista, vc tem q usar um laço de repetição para passar por cada objeto da lista.

Vou tentar aqui.

kxmm
kxmm:
Andersonrms:
kxmm:
Ah sim, pensei que ele ficar entrando no looping e retornando. O problema com o break foi resolvido, tá retornando certinho agora. Quanto a retirar o parêntese não fez diferença. O método tá retornando bibliotecapessoal.Livro@addbf1 ao invés de retornar as informações do livro, assim como o método retornaLista.

Tá imprimindo o nome q a JVM dá para cada objeto. Para vc imprimir as informações do livro, basta vc usar os métodos get da classe Livro, a partir do objeto livro q foi retornado do método. E no caso da lista, vc tem q usar um laço de repetição para passar por cada objeto da lista.

Vou tentar aqui.

Então, fiz aqui. Ficou assim:

package bibliotecapessoal;
import java.util.ArrayList;
        
public class Biblioteca {
    
    int numLivros;
    public final int MAXLIV = 50;
    ArrayList<Livro> livros;

    public Biblioteca (){
       numLivros = 0;
       livros = new ArrayList<Livro>(MAXLIV); }
    
    
    public void addLivro(String titulo, String autores, String editora){
        Livro livro = new Livro(titulo,autores,editora);
        livros.add(livro); }
    
    public void addLivro(Livro livro){
       livros.add(livro); }   
    
    public void remover(String titulo){
        for (int i = 0; i < livros.size(); i++) {  
          if (livros.get(i).getTitulo().equals(titulo)) {  
            livros.remove(i); } } }

    public void remover(Livro livro){
        livros.remove(livro); }
        
     public Livro retornaLivro(String titulo){  
        for (int i = 0; i < livros.size(); i++) {    
          if (livros.get(i).getTitulo().equals(titulo))     
            return livros.get(i);}    
            return null;}   
            
             
    public void retornaLista (){
        for (int i=0; i < livros.size();i++){
          System.out.println(livros.get(i).getTitulo());  
        }
    }
    
    public int retornaNumLivros(){
        numLivros=livros.size();
        return numLivros; }
    
    
    public static void main(String[] args) {
        
        Biblioteca bib1 = new Biblioteca();
        
        Livro livro1 = new Livro("O Último Reino","BERNARD CORNWELL","Record");
        Livro livro2 = new Livro("O Buraco da Agulha","KEN FOLLETT & ORLANDO LEMOS ","Bestbolso");
        
        bib1.addLivro(livro1);
        bib1.addLivro(livro2);
        bib1.addLivro("A Colina das Bruxas","Marion Zimmer","Difel");
        bib1.addLivro("O Relojoeiro Cego","RICHARD DAWKINS","Companhia das Letras");
        
        System.out.println("Título: "+bib1.retornaLivro("O Buraco da Agulha").getTitulo() +" Autores: "+ bib1.retornaLivro("O Buraco da Agulha").getAutores()+ " Editora: " + bib1.retornaLivro("O Buraco da Agulha").getEditora() );
        System.out.println(bib1.retornaLivro("As Últimas Quatro Coisas")); //retorna null, livro não existe na lista
        bib1.retornaLista(); // retorna a lista
        bib1.remover(livro1); //remove O Último Reino
        bib1.remover("A Colina das Bruxas"); // remove A Colina das Bruxas
        System.out.println(bib1.retornaNumLivros()); //quantidade de livros na lista
        bib1.retornaLista(); // novo retorno da lista após exclusões
    }
   
}

Está funcional. Tudo OK. Acha que ficou certo assim?
Agora é implementar a parte do exercício 10.

#Na classe Livro, crie uma lista de autores ao invés de armazenar todos os
autores em uma única string. Também modifique a informação sobre a editora
que publicou o livro, passando agora a ter os seguintes dados sobre cada
editora: CNPJ, nome, endereço e telefone;
# Crie uma classe de interface com o usuário com opções para cadastrar e
excluir livros (e editoras) de uma biblioteca, pesquisar por um livro imprimindo
seus dados e imprimir a relação de todos os livros.

Pode me dar um norte? Não estudei classe de interface ainda.

Andersonrms

Parece estar certo sim. Pra vc não ficar chamando o método retornaLivro para retornar o msm objeto toda hora, cria uma variável d livro para recuperar o livro apenas uma vez, e a partir dessa variável vc chama os gets da msm forma q vc está chamando.

Sobre interface, acho q é mais fácil usar a classe javax.swing.JOptionPane, pq não é muito amigável criar interfaces gráficas sem o auxílio de uma IDE. Vê se t ajuda:

http://www.tiexpert.net/programacao/java/joptionpane.php

http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html

kxmm

Andersonrms:
Acho q é mais fácil usar a classe javax.swing.JOptionPane, pq não é muito amigável criar interfaces gráficas sem o auxílio de uma IDE. Vê se t ajuda:

http://www.tiexpert.net/programacao/java/joptionpane.php

http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html

Depois dou uma olhada. Vou pra aula agora. Valeu pela ajuda.

kxmm

kxmm:
Andersonrms:
Acho q é mais fácil usar a classe javax.swing.JOptionPane, pq não é muito amigável criar interfaces gráficas sem o auxílio de uma IDE. Vê se t ajuda:

http://www.tiexpert.net/programacao/java/joptionpane.php

http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html

Depois dou uma olhada. Vou pra aula agora. Valeu pela ajuda.

Então, conversei com o professor e ele disse que essa classe não precisa ser gráfica. Só receber os comando do usuário e tal.
Mas gostei do link que mandou, quero aprender a parte gráfica também.

Agora preciso concluir o trabalho, só falta esse exercício 10. Vou ver se consigo terminar hoje, pois estou em semana de provas.
Se alguém puder dar uma ajuda, eu seria muito grato.

kxmm

Na classe Livro, crie uma lista de autores ao invés de armazenar todos os
autores em uma única string. Também modifique a informação sobre a editora
que publicou o livro, passando agora a ter os seguintes dados sobre cada
editora: CNPJ, nome, endereço e telefone;

Pessoal, essa parte está certa?

package bibliotecapessoal;
import java.util.ArrayList;

public class Livro {
  private String titulo, editora; 
  ArrayList<String> autores;
  
    public Livro(String titulo, String autores, String editora) {
        this.titulo = titulo;
        this.autores = new ArrayList<String>();
        this.autores.add(autores);
        this.editora = editora; }
   
    public String getTitulo(){
        return titulo; }
 
    public ArrayList getAutores(){
        return autores; }
   
    public String getEditora(){
        return editora; }
   
    public void setTitulo(String titulo){
        this.titulo=titulo; }
   
    public void setAutores(int ind,String autores){ 
        this.autores.set(ind,autores);} 
   
    public void setEditora(String editora){
        this.editora=editora; }
    }

A parte da editora, como vou fazer pra acrescentar outros dados nela? (CNPJ, nome, endereço e telefone)

kxmm

Enquanto isso estou tentando fazer a classe usuário.

Eis o que tenho até agora (estou tendo dificuldade para invocar os métodos):

package bibliotecapessoal;
import java.util.*;
public class Usuario {
   
    public static void main(String[] args) {
        
        System.out.println("O que deseja fazer?");
        System.out.println("");
        System.out.println("1- Adicionar Livro");
        System.out.println("2- Excluir Livro");
        System.out.println("3- Adicionar Editora");
        System.out.println("4- Excluir Editora");
        System.out.println("5- Pesquisar Livro (por título)");
        System.out.println("6- Listar Livros Cadastrados");
        System.out.println("0- Sair");
        System.out.println("");
        System.out.print("Digite sua opção: ");
        
        Scanner entrada  = new Scanner(System.in);
        Biblioteca b1 = new Biblioteca();
        String s1,s2,s3;
        boolean continuar=true;
        
            do {    
              switch (entrada.nextInt()) {
                case 1: //===================================================
                        System.out.print("Digite o nome do Livro: ");
                        s1=entrada.nextLine();
                        System.out.print("Digite o autor: ");
                        s2=entrada.nextLine();
                        System.out.print("Digite a editora: ");
                        s3=entrada.nextLine();
                        b1.addLivro(s1, s2, s3);break;
                case 2: //====================================================
                        System.out.print("Digite o titulo do livro que deseja remover: ");
                        s1=entrada.nextLine();
                        b1.remover(s1);break;                
                case 3: //====================================================
                        System.out.print("Digite o nome da Editora que deseja adicionar: ");
                        s1=entrada.nextLine();
                case 4: //====================================================
                        System.out.print("Digite o nome da Editora que deseja remover: ");
                        s1=entrada.nextLine();
                case 5: //====================================================
                        System.out.print("Digite o nome do livro que deseja buscar: ");
                        s1=entrada.nextLine();
                        b1.retornaLivro(s1);break;
                case 6: //====================================================
                        b1.retornaLista();break;
                case 0: //====================================================
                        continuar=false; break;   
              default: //====================================================
                       System.out.println("Opção inválida.");break; }
            }while(continuar=true); 

      }
}
Criado 10 de abril de 2012
Ultima resposta 11 de abr. de 2012
Respostas 18
Participantes 4