Dúvida sobre Array

Olá pessoal,

Estou tentando realizar um trabalho da faculdade mas não estou conseguindo…

a descrição do trabalho segue a baixo:

Uma biblioteca armazena as seguintes informações dos livros em seu acervo: nome da obra, nome do autor, editora e número de páginas. Escreva um algoritmo altamente modularizado que leia e armazene as informações de 500 livros e em seguida disponibilize os seguintes dados:
a) Nome do autor com mais obras catalogadas;

Então eu sei que posso criar um arraylist de Livros, mas como percorrer este array e ao mesmo tempo trazer o nome do autor com mais obras.

Porfavor se puderem me ajudar.

Abs

Por “altamente modularizado” entendo que seja necessária uma classe Autor. Nesta pode ser colocada alguma forma de relação, tal como índices para os livros que correspondem a este autor. Desta forma pode percorrer a listagem de autores e procurar pelo que possui mais obras.

[]'s

Fala Adelar,

Blz cara?

O que você quer dizer que eu teria então que ter na minha classe Livro um atributo Autor?
E na minha classe Autor um atributo List<Livro> ??

Obrigado

[quote=lechnerdr]Fala Adelar,

Blz cara?

O que você quer dizer que eu teria então que ter na minha classe Livro um atributo Autor?
E na minha classe Autor um atributo List<Livro> ??

Obrigado[/quote]
Pode ser assim. Você pode obter a quantidade de livros da list na classe Autor. Só lembrando que esta é uma relação de n para n, ou seja, um livro pode ter um ou mais autores e um autor pode ter um livro ou mais.

[]'s

Digamos que eu queira fazer um relação 1 para n, ou seja, 1 autor poder ter vários livros… quando se tem um relação 1 para n, aquele que tem o N é o que recebe o atributo né?

Poderia ser assim??

public class Autor {

    private String nomeAutor;
    private Livro livro;
    private int numeroDeObra = 0;

    public Autor() {
        this.livro = new Livro();
    }

    public Autor(String nomeAutor) {
        this();
        this.nomeAutor = nomeAutor;
        this.numeroDeObra++;
    }

    public String getNomeAutor() {
        return nomeAutor;
    }

    public void setNomeAutor(String nomeAutor) {
        this.nomeAutor = nomeAutor;
    }

    public Livro getLivro() {
        return livro;
    }

    public void setLivro(Livro livro) {
        this.livro = livro;
    }
    
}

Abs

Neste caso é uma relação de 1 para 1. Pois como como você somente instancia somente uma classe Autor cada autor pode ter somente um livro.
Trocando o atributo livro para o tipo ArrayList, por exemplo, permite colocar uma relação de 1 para n.

[]'s

Putz,

É verdade!!!

Dei uma melhora, ve o que achas…

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.teste;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Darkside2
 */
public class Autor {

    private String nomeAutor;
    private List<Livro> livro;
    private int numeroDeObra = 0;

    public Autor() {
        this.livro = new ArrayList<Livro>();
    }

    public Autor(String nomeAutor) {
        this.nomeAutor = nomeAutor;
        this.numeroDeObra++;
    }

    public String getNomeAutor() {
        return nomeAutor;
    }

    public void setNomeAutor(String nomeAutor) {
        this.nomeAutor = nomeAutor;
    }

    public List<Livro> getLivro() {
        return livro;
    }

    public void addLivro(Livro livro){
        this.livro.add(livro);
    }
}

Absss

O exercício pede um algoritmo. Não uma implementação em Java. Ou estou errado?

Exato ele pede um algoritmo, mas estou tentando implementar em Java…

Mas você teria alguma ideia de algoritmo para este exercicio?

Obrigado,

Abss

[quote=lechnerdr]Putz,

É verdade!!!

Dei uma melhora, ve o que achas…

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.teste;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Darkside2
 */
public class Autor {

    private String nomeAutor;
    private List<Livro> livro;
    private int numeroDeObra = 0;

    public Autor() {
        this.livro = new ArrayList<Livro>();
    }

    public Autor(String nomeAutor) {
        this.nomeAutor = nomeAutor;
        this.numeroDeObra++;
    }

    public String getNomeAutor() {
        return nomeAutor;
    }

    public void setNomeAutor(String nomeAutor) {
        this.nomeAutor = nomeAutor;
    }

    public List<Livro> getLivro() {
        return livro;
    }

    public void addLivro(Livro livro){
        this.livro.add(livro);
    }
}

Absss[/quote]
Isso. Agora você pode fazer um método que receba uma lista de autores, armazene o com maior quantidade de livros que encontrar e retorne o índice deste autor (ou retorne a própria classe).

[]'s

você terá e criar um registro para armazenar os dados e um array para armazenar o tipo do registro.

Dependendo da disciplina que este problema foi passado a forma que @gemeosguimaraes passou pode se encaixar melhor.
Vou ter que sair. Boa sorte. Amanhã visito o tópico novamente :slight_smile:

[]'s

Existe uma classe chamada Map, que permite criar uma relação entre um objeto (que pode ser um autor) e um número.

Em java, ficaria:

[code]//Conta
Map<Autor, Integer> contaLivrosDoAutor = new HashMap<Autor, Integer>();
for (Livro livro : livros) {
Autor autor = livro.getAutor();
if (!contaLivrosDoAutor.contains(autor) {
contaLivrosDoAutor.put(autor, 0);
}
contaLivrosDoAutor.put(autor, contaLivrosDoAutor.get(Autor) + 1);
}

//Vê qual autor teve mais livros
Autor autor = null;
int count = 0;
for (Entry<Autor, Integer> contagemAutor : contaLivrosAutor) {
if (contagemAutor.getValue() > count) {
autor = contagemAutor.get();
count = contagemAutor.getValue();
}
}

System.out.println(“And the oscar goes to…” + autor.getNome());[/code]

Fala Vini,

Blz?

Cara não entendi a tua implementação…
No 1 for, tu itera sobre livro, mas aonde está esta lista?

Outra duvida seria aonde fica o meu atributo autor?? pois ali você faz livro.getAutor()

Obrigado,

Abss

Conseguiu resolver?

Fala Adelar,

Blz?

Cara fiz uma implementação conforme o Vini deu a ideia…
Abaixo segue a minha implementação:

public class Livro {

    private String nomeDaObra;
    private String editora;
    private int numeroDePagina;
    private String nomeAutor;

    public Livro() {
    }

    public Livro(String nomeDaObra, String editora, int numeroDePagina, String autor) {
        this.nomeDaObra = nomeDaObra;
        this.editora = editora;
        this.numeroDePagina = numeroDePagina;
        this.nomeAutor = autor;
    }

    public String getEditora() {
        return editora;
    }

    public void setEditora(String editora) {
        this.editora = editora;
    }

    public String getNomeDaObra() {
        return nomeDaObra;
    }

    public void setNomeDaObra(String nomeDaObra) {
        this.nomeDaObra = nomeDaObra;
    }

    public int getNumeroDePagina() {
        return numeroDePagina;
    }

    public void setNumeroDePagina(int numeroDePagina) {
        this.numeroDePagina = numeroDePagina;
    }

    public String getNomeAutor() {
        return nomeAutor;
    }

    public void setNomeAutor(String nomeAutor) {
        this.nomeAutor = nomeAutor;
    }

    public static String listaAutorComMaisObras(List<Livro> livros){
        Map<String, Integer> contaLivrosDoAutor = new HashMap<String, Integer>();
         for (Livro livro : livros) {
            String nomeAutor = livro.getNomeAutor();
            if (!contaLivrosDoAutor.containsKey(nomeAutor)) {
               contaLivrosDoAutor.put(nomeAutor, 0);
            }
            contaLivrosDoAutor.put(nomeAutor, contaLivrosDoAutor.get(nomeAutor) + 1);
         }

         //Vê qual autor teve mais livros
         String livro = null;
         int count = 0;
         for (Map.Entry<String, Integer> contagemAutor : contaLivrosDoAutor.entrySet()) {
           if (contagemAutor.getValue() > count) {
               livro = contagemAutor.getKey();
               count = contagemAutor.getValue();
            }
         }
        return livro;
    }

Obrigado pela atenção e ajuda!