Problemas com ArrayList

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

[code]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; }
}[/code]

Agora parte da classe Biblioteca:

[code]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); }   [/code]

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?

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

[quote=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[/quote]

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:

[code]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); }

[/code]

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

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):

[code]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); } [/code]

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

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

[quote=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); } }[/quote]

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.

Pessoal, a minha classe Biblioteca por fim ficou assim:

[code]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());
    
}

}
[/code]

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.

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.

[quote=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.[/quote]

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.

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.

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.

[quote=Andersonrms][quote=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.
[/quote]

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.[/quote]

Vou tentar aqui.

[quote=kxmm][quote=Andersonrms][quote=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.
[/quote]

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.[/quote]

Vou tentar aqui.[/quote]

Então, fiz aqui. Ficou assim:

[code]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
}

}
[/code]

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.

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

[quote=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[/quote]

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

[quote=kxmm][quote=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[/quote]

Depois dou uma olhada. Vou pra aula agora. Valeu pela ajuda.[/quote]

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.

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?

[code]package bibliotecapessoal;
import java.util.ArrayList;

public class Livro {
private String titulo, editora;
ArrayList 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; }
}[/code]

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

Enquanto isso estou tentando fazer a classe usuário.

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

[code]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); 

  }

}[/code]