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.
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.
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.
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;
}
}
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.
/*
* 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).
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
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]