[RESOLVIDO] Cadastro de animais

29 respostas
poojava
G

Bom dia, rapaziada.
Estou com um pouco de dificuldade em fazer um programa para cadastro de animais em POO.

Descrição:

Informações presentes no cadastro: código do animal, nome do animal, peso do animal,
idade do animal, tempo total de vida do animal, habitat natural, data do cadastro.
a) Opção para cadastro do animal
b) Opção para alterar todos os dados pelo código
c) Opção para pesquisar o cadastro pelo nome
d) Opção para mostrar os dados do animal com maior tempo de vida de um habitat digitado
e) Opção para mostrar todos os dados de cadastro de uma data
f) Opção para mostrar a média de peso e idade de todos os animais

CLASSE:

public class Animal {
private int codigoAnimal;
private String nome;
private float peso;
private int idade;
private int totalVida;
private String habitate;
private int data;



public void setCodigoAnimal(int codigoAnimal){
    this.codigoAnimal = codigoAnimal;
}

public int getCodigoAnimal(){
    return this.codigoAnimal;
}

public void setNome (String nome){
    this.nome = nome;
}

public String getNome(){
    return this.nome;
}

public void setPeso (float peso){
    this.peso = peso;
}

public float getPeso(){
    return this.peso;
}

public void setIdade (int idade){
    this.idade = idade;
}

public int getIdade(){
    return this.idade;
}

public void setTotalVida (int totalVida){
    this.totalVida = totalVida;
}

public int getTotalVida(){
    return this.totalVida;
}

public void setHabitate (String habitate){
    this.habitate = habitate;
}

public String getHabitate(){
    return this.habitate;
}
public void setData (int data){
    this.data = data;
}

public int getData(){
    return this.data;
}
public void imprimirDados(){
    System.out.println("CODIGO ANIMAL: " + codigoAnimal);
    System.out.println("NOME DO ANIMAL: " + nome);
    System.out.println("PESO DO ANIMAL: " + peso);
    System.out.println("IDADE DO ANIMAL: " + idade);
    System.out.println("HABITATE: " + habitate);
    System.out.println("TOTAL DA VIDA: " + totalVida);
    System.out.println("DATA DO CADASTRO: " + data);
}

}

MAIN:

import java.util.Scanner;

public class TesteAnimal {

public static void main(String[] args) {

String resp = s;
Scanner ler = new Scanner(System.in);
 ArrayList <Animal> animais = new ArrayList<>();
 
 while(resp == "S" || resp == "s"){
    Animal a1 = new Animal();   
    System.out.println("Digite o codigo do animal: ");
    a1.setCodigoAnimal(ler.nextInt());
    System.out.println("Digite o nome do animal: ");
    a1.setNome(ler.next());
    System.out.println("Qual o peso do animal: ");
    a1.setPeso(ler.nextFloat());
    System.out.println("Digite a idade do animal: ");
    a1.setIdade(ler.nextInt());
    System.out.println("Digite o tempo de vida animal: ");
    a1.setTotalVida(ler.nextInt());
    System.out.println("Digite o habitate animal: ");
    a1.setHabitate(ler.next());
    System.out.println("Digite a data do cadastro: ");
    a1.setData(ler.nextInt());
    animais.add(a1);
    System.out.println("Deseja continuar (S/N) : ");
    resp = ler.next();

}
}

Não estou conseguindo adicionar o ArrayList e nem conseguir fazer inserir o animal no cadastro.

29 Respostas

V

Tenho algumas sugestões. :wink: :grinning:

01 - Pelo que observei, na classe TesteAnimal você não importou a classe ArrayList:

import java.util.ArrayList;

02 - Não sei se sua classe Animal está no mesmo arquivo de TesteAnimal.java, senão, também será preciso importá-la.

03 - Você não pode passar como argumento um valor que não foi estabelecido como parâmetro. Observe essas linhas:

<s>public void setNome (String nome){

this.nome = nome;

}</s>

Ela apenas permite passar um argumento, que é do tipo String. Você está tentando passar um objeto Scanner mais o método next():

System.out.println("Digite o nome do animal: ");
a1.setNome(ler.next()); //O compilador vai reclamar…

Uma possível solução:

Uma forma mais simples de escrever e ler a entrada dos dados:

Animal a1 = new Animal();
String nomeDoAnimal;

System.out.println("Digite o nome do animal: ");
nomeDoAnimal = ler.next();
a1.setNome(nomeDoAnimal);

04 - Sugiro pensar na possibilidade de passar seus dados criando um método construtor na classe Animal. :wink:

G

Van, consegui fazer todas as alterações, está dando certo. Gostaria de saber como faço para imprimir a lista.

public class Animal{

  private int codigoAnimal;
  private String nome;
  private float peso;
  private int idade;
  private int totalVida;
  private String habitate;
  private int data;



  public void setCodigoAnimal(int codigoAnimal){
      this.codigoAnimal = codigoAnimal;
  }

  public int getCodigoAnimal(){
      return this.codigoAnimal;
  }

  public void setNome (String nome){
      this.nome = nome;
  }

  public String getNome(){
      return this.nome;
  }

  public void setPeso (float peso){
      this.peso = peso;
  }

  public float getPeso(){
      return this.peso;
  }

  public void setIdade (int idade){
      this.idade = idade;
  }

  public int getIdade(){
      return this.idade;
  }

  public void setTotalVida (int totalVida){
      this.totalVida = totalVida;
  }

  public int getTotalVida(){
      return this.totalVida;
  }

  public void setHabitate (String habitate){
      this.habitate = habitate;
  }

  public String getHabitate(){
      return this.habitate;
  }
  public void setData (int data){
      this.data = data;
  }

  public int getData(){
      return this.data;
  }
  public void imprimirDados(){
      System.out.println("CODIGO ANIMAL: " + codigoAnimal);
      System.out.println("NOME DO ANIMAL: " + nome);
      System.out.println("PESO DO ANIMAL: " + peso);
      System.out.println("IDADE DO ANIMAL: " + idade);
      System.out.println("HABITATE: " + habitate);
      System.out.println("TOTAL DA VIDA: " + totalVida);
      System.out.println("DATA DO CADASTRO: " + data);
  }



  import java.util.ArrayList;
  import java.util.Scanner;
  public class TesteAnimal {
  public static void main(String[] args) {
  Scanner ler = new Scanner(System.in);
  ArrayList <Animal> animais = new ArrayList<Animal>();
  int resp = 1;
  Animal a1 = new Animal();
  System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
  resp = ler.nextInt();
  
  while(resp =! 0){   
    
      System.out.println("Digite o codigo do animal: ");
      a1.setCodigoAnimal(ler.nextInt());
      System.out.println("Digite o nome do animal: ");
      a1.setNome(ler.next());
      System.out.println("Qual o peso do animal: ");
      a1.setPeso(ler.nextFloat());
      System.out.println("Digite a idade do animal: ");
      a1.setIdade(ler.nextInt());
      System.out.println("Digite o tempo de vida animal: ");
      a1.setTotalVida(ler.nextInt());
      System.out.println("Digite o habitate animal: ");
      a1.setHabitate(ler.next());
      System.out.println("Digite a data do cadastro: ");
      a1.setData(ler.nextInt());
      animais.add(a1);
      Animal a1 = new Animal();
      System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR: ");
      resp = ler.nextInt();
    }

  }

E como faço para manipular.

V

:grinning::clap::clap::clap::clap::clap::clap::clap::clap:

Para imprimir

Da mesma forma que você escreveu para inserir os dados, usando um laço.

Você pode fazer algo assim:

for(Animal a: animais){
       System.out.println(a);
}

ou ainda:

for(int i = 0; i < animais.size(); i++){
      System.out.println(animais.get(i).getNome());
}

Para manipular

Você pode utilizar alguns comando assim:

Ver um item:

animais.get(n).getNome();

onde n = é o numero do índice que quer consultar.

Remover um item:

animais.remover(n).getNome();

Outras formas de manipulação podem ser encontradas na documentação. :wink:

D

Você se equivocou nisto, ao fazer ler.next() será retornado uma String que será passada como argumento para a1.setNome(...), portanto, a1.setNome(ler.next()); funciona corretamente e dá o mesmo resultado de fazer String nomeDoAnimal = ler.next(); a1.setNome(nomeDoAnimal);.

No java até existe a possibilidade de passar métodos por parâmetro, usando ::, mas é outro assunto.

Veja na documentação um exemplo: System.out.println(s.next());.

D

É legal na Orientação à Objetos fazer com que cada objeto cuide de preservar seus dados internos consistentes, por exemplo, você pode querer que nenhum Animal no seu sistema tenha uma idade negativa, para fazer isso, adicione código de validação ao método que permite alterar a idade, por exemplo:

public void setIdade(int idade) {
      if (idade <=0) throw new IllegalArgumentException("A idade deve ser maior que Zero!");
      this.idade = idade;
  }

Outro ponto interessante, é a questão do tempo total de vida, isso não seria o mesmo que a idade?

Veja o requisito:

d) Opção para mostrar os dados do animal com maior tempo de vida de um habitat digitado

Esse requisito está pedindo para mostrar o Animal com maior idade para um dado habitat, não é isso mesmo? Se for assim, você não precisa de um atributo totalVida e nem cadastrar um valor para ele.

V

@Douglas-Silva, perdão?! Não tinha observado isso. :blush:

@Gustavo_Henrique2, perdão?! Ele está certo. :grin: :blush:

S

Na verdade ele está passando como parâmetro o retorno do método next(), que retorna um objeto do tipo String, então o compilador não vai reclamar.

V

@staroski :blush: :arrow_up:

G

Fran, quando vou imprimir não aparece os dados e sim isso:
Animal@d93b30

V

Posta o código atualizado. :blush:

G
public class Animal{

  private int codigoAnimal;
  private String nome;
  private float peso;
  private int idade;
  private int totalVida;
  private String habitate;
  private int data;



  public void setCodigoAnimal(int codigoAnimal){
      this.codigoAnimal = codigoAnimal;
  }

  public int getCodigoAnimal(){
      return this.codigoAnimal;
  }

  public void setNome (String nome){
      this.nome = nome;
  }

  public String getNome(){
      return this.nome;
  }

  public void setPeso (float peso){
      this.peso = peso;
  }

  public float getPeso(){
      return this.peso;
  }

  public void setIdade (int idade){
      this.idade = idade;
  }

  public int getIdade(){
      return this.idade;
  }

  public void setTotalVida (int totalVida){
      this.totalVida = totalVida;
  }

  public int getTotalVida(){
      return this.totalVida;
  }

  public void setHabitate (String habitate){
      this.habitate = habitate;
  }

  public String getHabitate(){
      return this.habitate;
  }
  public void setData (int data){
      this.data = data;
  }

  public int getData(){
      return this.data;
  }
  public void imprimirDados(){
      System.out.println("CODIGO ANIMAL: " + codigoAnimal);
      System.out.println("NOME DO ANIMAL: " + nome);
      System.out.println("PESO DO ANIMAL: " + peso);
      System.out.println("IDADE DO ANIMAL: " + idade);
      System.out.println("HABITATE: " + habitate);
      System.out.println("TOTAL DA VIDA: " + totalVida);
      System.out.println("DATA DO CADASTRO: " + data);
  }
  }





  import java.util.ArrayList;
  import java.util.Scanner;
  public class TesteAnimal {
  public static void main(String[] args) {
  Scanner ler = new Scanner(System.in);
  ArrayList <Animal> animais = new ArrayList<Animal>();
  int resp = 1;
  Animal a1 = new Animal();
  System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
  resp = ler.nextInt();

  while(resp != 0){

      System.out.println("Digite o codigo do animal: ");
      a1.setCodigoAnimal(ler.nextInt());
      System.out.println("Digite o nome do animal: ");
      a1.setNome(ler.next());
      System.out.println("Qual o peso do animal: ");
      a1.setPeso(ler.nextFloat());
      System.out.println("Digite a idade do animal: ");
      a1.setIdade(ler.nextInt());
      System.out.println("Digite o tempo de vida animal: ");
      a1.setTotalVida(ler.nextInt());
      System.out.println("Digite o habitate animal: ");
      a1.setHabitate(ler.next());
      System.out.println("Digite a data do cadastro: ");
      a1.setData(ler.nextInt());
      animais.add(a1);
      System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR: ");
      resp = ler.nextInt();
    }
	for (int i = 0; i < animais.size(); i++) {
		System.out.println(animais.get(i));
	}


  }}
V

Isso acontece porque você não está especificando qual parte da lista quer imprimir. Para isso, é necessário utilizar os métodos de acesso da classe(mais especificamente os getters). Vou corrigir minha resposta lá para cima :blush:. Exemplo de como isso pode ser feito:

System.out.println(animal.get(i).getNome());

Se quiser imprimir mais de um atributos, basta concatenar. Exemplo:

System.out.println(animal.get(i).getNome() + " " + animal.get(i).getPeso());

S

A implementação padrão do método toString() retorna isso:
<nome da classe> + '@' + <identity hashcode>.

Se você quer que objetos da classe Animal apresentem dados no método toString(), você precisa sobrescrever este método.

G

Van, aqui deu certo tinha feito e foi, pensei que como estou chamando a ArrayList iria aparecer todos os atributos.

V

Que bom que deu certo! :blush::clap::clap::clap::clap::clap:
Não, não… é preciso especificar. É trabalhoso, mas poder chamar cada atributo individualmente é muito útil, pois às vezes você pode precisar disso. :blush:

Caso a sua questão tenha sido resolvida, não esqueça de marcar como [RESOLVIDA]. :wink:

V

Que legal! Não sabia disso… :blush:
Mas como eu poderia sobrescrever o método toString() para exibir todos os itens da lista? Fiquei curiosa…:thinking: Poderia dar um exemplo? :grin:

P

algo como

... toString(){
  return nome + " " + peso;
}
V

Legal! Obrigada! :blush: :grinning:

G

Desculpa mais uma vez volta rs, só que esta imprimindo duplicado, se eu adiciona duas lista ele printa só a primeira.

import java.util.ArrayList;
    import java.util.Scanner;
    public class TesteAnimal {
    public static void main(String[] args) {
    Scanner ler = new Scanner(System.in);
    ArrayList <Animal> animais = new ArrayList<Animal>();
    int resp = 1;
    Animal a1 = new Animal();
    System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
    resp = ler.nextInt();

      while(resp != 0){
        System.out.println("Digite o codigo do animal: ");
        a1.setCodigoAnimal(ler.nextInt());
        System.out.println("Digite o nome do animal: ");
        a1.setNome(ler.next());
        System.out.println("Qual o peso do animal: ");
        a1.setPeso(ler.nextFloat());
        System.out.println("Digite a idade do animal: ");
        a1.setIdade(ler.nextInt());
        System.out.println("Digite o tempo de vida animal: ");
        a1.setTotalVida(ler.nextInt());
        System.out.println("Digite o habitate animal: ");
        a1.setHabitate(ler.next());
        System.out.println("Digite a data do cadastro: ");
        a1.setData(ler.nextInt());
        animais.add(a1);
        System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR: ");
        resp = ler.nextInt();
        }

        for (int i = 0; i < animais.size(); i++){
        System.out.println("Codigo: " + animais.get(i).getCodigoAnimal());
        System.out.println("NOME: " + animais.get(i).getNome());
        System.out.println("PESO: " + animais.get(i).getPeso());
        System.out.println("IDADE: " + animais.get(i).getIdade());
        System.out.println("TOTAL VIDA: " + animais.get(i).getTotalVida());
        System.out.println("HABITATE: " + animais.get(i).getHabitate());
        System.out.println("Codigo: " + animais.get(i).getData());
        } 


      }}
G

Não entendi, teria que criar um metodo toString()?

public Animal toString(int codigoAnimal, String nome, float peso, int idade, int totalVida, String habitate, int data) ;{}
G

Van, ele está duplicando, se eu colocar, se for cadastrar só um blz… agora se for 2 ele duplica o primeiro cadastro e os outros não.

G

DIGITE 1 PARA CADASTRAR E 0 PARA SAIR
1
Digite o codigo do animal:
8
Digite o nome do animal:
REX
Qual o peso do animal:
45
Digite a idade do animal:
25
Digite o tempo de vida animal:
45
Digite o habitate animal:
RUA
Digite a data do cadastro:
25
DIGITE 1 PARA CADASTRAR E 0 PARA SAIR:
1

Digite o codigo do animal:
2
Digite o nome do animal:
CACHORRO
Qual o peso do animal:
2
Digite a idade do animal:
2
Digite o tempo de vida animal:
2
Digite o habitate animal:
NATA
Digite a data do cadastro:
25
DIGITE 1 PARA CADASTRAR E 0 PARA SAIR:
0

Codigo: 2
NOME: CACHORRO
PESO: 2.0
IDADE: 2
TOTAL VIDA: 2
HABITATE: NATA
DATA CADASTRO: 25

Codigo: 2
NOME: CACHORRO
PESO: 2.0
IDADE: 2
TOTAL VIDA: 2
HABITATE: NATA
DATA CADASTRO: 25

V

Ok! Perdão! Estou verificando aqui… :grin:

V

Acho que entendi o que aconteceu. Olha só:

Quando você criou Animal a1 você criou um único objeto apenas. Então todo vez que o usuário digitar 1, ele vai sobre escrever os dados do objeto anterior.

Sugiro pensar assim, um animal só pode ser um animal e não dois. Está duplicado, porque você está tentando 2 animais dentro um.

Por isso, sugiro utilizar o construtor para guardar dados dentro da sua lista. Assim ele vai criar um novo objeto sempre que algo for inserido na lista…

Exemplo como fazer isso:

Na classe Animal:

class Animal {
	private int codigoAnimal;
	private String nome;
	private float peso;
	private int idade;
	private int totalVida;
	private String habitate;
	private int data;

    //Método construtor
	public Animal(int codigoAnimal, String nome){
		this.codigoAnimal = codigoAnimal;
		this.nome = nome;
	}
	
	/*Getters e Setters*/

Na classe TesteAnimal:

Scanner ler = new Scanner(System.in);
    ArrayList <Animal> animais = new ArrayList<Animal>();
    int resp = 1;
	
    System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
    resp = ler.nextInt();
      while(resp != 0){
		int codigo;
		String nome;
	
        //Primeiro lê os dados
        System.out.println("Digite o codigo do animal: ");
        codigo = ler.nextInt();
        System.out.println("Digite o nome do animal: ");
		nome = ler.next();
        
        //Depois salva na lista
		animais.add(new Animal(codigo,nome));
		
		System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
        resp = ler.nextInt();
        }

        for (int i = 0; i < animais.size(); i++){
			System.out.println("Codigo: " + animais.get(i).getCodigoAnimal());
			System.out.println("NOME: " + animais.get(i).getNome());
        }

S

Se quiser sobrescrever o método toString(), não é da forma como você postou.

Exemplo:

public class Animal {

    private int codigoAnimal;
    private String nome;
    private float peso;
    private int idade;
    private int totalVida;
    private String habitate;
    private int data;

    public void setCodigoAnimal(int codigoAnimal) {
        this.codigoAnimal = codigoAnimal;
    }

    public int getCodigoAnimal() {
        return this.codigoAnimal;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getNome() {
        return this.nome;
    }

    public void setPeso(float peso) {
        this.peso = peso;
    }

    public float getPeso() {
        return this.peso;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    public int getIdade() {
        return this.idade;
    }

    public void setTotalVida(int totalVida) {
        this.totalVida = totalVida;
    }

    public int getTotalVida() {
        return this.totalVida;
    }

    public void setHabitate(String habitate) {
        this.habitate = habitate;
    }

    public String getHabitate() {
        return this.habitate;
    }

    public void setData(int data) {
        this.data = data;
    }

    public int getData() {
        return this.data;
    }

    @Override
    public String toString() {
        StringBuilder texto = new StringBuilder();
        texto.append("CODIGO ANIMAL: ").append(codigoAnimal).append("\n");
        texto.append("NOME DO ANIMAL: ").append(nome).append("\n");
        texto.append("PESO DO ANIMAL: ").append(peso).append("\n");
        texto.append("IDADE DO ANIMAL: ").append(idade).append("\n");
        texto.append("HABITAT: ").append(habitate).append("\n");
        texto.append("TOTAL DA VIDA: ").append(totalVida).append("\n");
        texto.append("DATA DO CADASTRO: ").append(data);
        return texto.toString();
    }

    public void imprimirDados() {
        System.out.println(this);
    }
}
G

Fiz um construtor e ele parou de duplicar van, só que agora estou com outra duvida, fiz o sistema de pesquisa animal por nome, só que agora queria que o usuário digitasse o habita-te e aparecesse o animal com maior tempo de vida daquele habita-te.

import java.util.ArrayList;
        import java.util.Scanner;

        public class TesteAnimal {
        public static void main(String[] args) {
        Scanner ler = new Scanner(System.in);
        ArrayList <Animal> animais = new ArrayList<>();
        int resp = 1;
        String busca;
        System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
        resp = ler.nextInt();

        //INCLUSÃO DE ARRAYLIST
         while(resp != 0){
           int codigo;
           String nome;
           float peso;
           int idade;
           int total;
           String habitate;
           int data;

           System.out.println("Digite o codigo do animal: ");
           codigo = ler.nextInt();
           System.out.println("Digite o nome do animal: ");
           nome = ler.next();
           System.out.println("Qual o peso do animal: ");
           peso = ler.nextFloat();
           System.out.println("Digite a idade do animal: ");
           idade = ler.nextInt();
           System.out.println("Digite quanto tempo este animal vive: ");
           total = ler.nextInt();
           System.out.println("Digite o habitate animal: ");
           habitate = ler.next();
           System.out.println("Digite a data do cadastro: ");
           data = ler.nextInt();
           animais.add(new Animal(codigo, nome, peso, idade, total, habitate, data));
           System.out.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR: ");
           resp = ler.nextInt();
            }

        //IMPRESSÃO DA LISTA
           for (int i = 0; i < animais.size(); i++){
            System.out.println("\nCodigo: " + animais.get(i).getCodigoAnimal());
            System.out.println("NOME: " + animais.get(i).getNome());    
            System.out.println("PESO: " + animais.get(i).getPeso());
            System.out.println("IDADE: " + animais.get(i).getIdade());
            System.out.println("HABITATE: " + animais.get(i).getHabitate());
            System.out.println("TEMPO DE VIDA: " + animais.get(i).getTotalVida());
            System.out.println("DATA CADASTRO: " + animais.get(i).getData());
                }    

        //SISTEMA DE BUSCA
           System.out.println("\nDigite o nome do animal a ser pesquisado: ");    
           String nome = ler.next();  
           for(int i = 0; i < animais.size(); i ++){
            if(animais.get(i).getNome().equals(nome)){  
              System.out.println("\nCodigo: " + animais.get(i).getCodigoAnimal());
              System.out.println("NOME: " + animais.get(i).getNome());    
              System.out.println("PESO: " + animais.get(i).getPeso());
              System.out.println("IDADE: " + animais.get(i).getIdade());
              System.out.println("TEMPO DE VIDA: " + animais.get(i).getTotalVida());    
              System.out.println("HABITATE: " + animais.get(i).getHabitate());
              System.out.println("DATA CADASTRO: " + animais.get(i).getData());  
               break;  
              }}  

        //SISTEMA DE ALTERAÇÃO aqui e a tentativa que falhei
           System.out.println("\nDigite o habitate que deseja saber qual o animal com maior tempo de vida: ");    
           String habitate = ler.next();  
            for(int i = 0; i < animais.size(); i ++){
                if(animais.get(i).getHabitate().equals(habitate) > animais.get(i).getHabitate().equals(habitate)){
          }
            }
            }}
V

Perdão, pela demora na resposta… Dia estranho…:grin:

Que bom que deu certo! :blush:

Sua dúvida não ficou muito clara para mim… Você quer fazer a busca usando o habitate como critério e exibir o nome com maior tempo de vida? :thinking:

Minha pergunta é, o que você tentou fazer nessas linhas em relação a pergunta que fez:

Poderia tentar deixar um pouco mais claro? :smiley:

G

O usuário iria digitar um habita-te que deseja saber EX: (Habita-te: Floresta) e iria exibir o animal com maior tempo de vida dentro daquele habita-te.

S

Prezado, não é "habita-te" nem "habitate" o termo correto é "habitat". :wink:

Se você quebrar seu programa em métodos menores, tudo fica mais fácil.
Exemplo:

import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class TesteAnimal {

    public static void main(String[] args) {
        TesteAnimal programa = new TesteAnimal();
        programa.executar();
    }

    private ArrayList<Animal> animais = new ArrayList<>();
    private final Scanner entrada = new Scanner(System.in);

    private final PrintStream saida = System.out;

    public void executar() {
        cadastrarAnimais();

        apresentarAnimais();

        Animal animal = buscarAnimalPorNome();
        apresentarAnimal(animal);

        animal = buscarAnimalComMaiorTempoDeVidaPorHabitat();
        apresentarAnimal(animal);
    }

    private void apresentarAnimais() {
        // IMPRESSÃO DA LISTA
        for (int i = 0; i < animais.size(); i++) {
            Animal animal = animais.get(i);
            apresentarAnimal(animal);
        }
    }

    private void apresentarAnimal(Animal animal) {
        saida.println("\nCodigo: " + animal.getCodigoAnimal());
        saida.println("NOME: " + animal.getNome());
        saida.println("PESO: " + animal.getPeso());
        saida.println("IDADE: " + animal.getIdade());
        saida.println("TEMPO DE VIDA: " + animal.getTotalVida());
        saida.println("HABITATE: " + animal.getHabitate());
        saida.println("DATA CADASTRO: " + animal.getData());
    }

    private Animal buscarAnimalComMaiorTempoDeVidaPorHabitat() {
        // SISTEMA DE ALTERAÇÃO aqui e a tentativa que falhei
        saida.println("\nDigite o habitate que deseja saber qual o animal com maior tempo de vida: ");
        String habitate = entrada.next();
        Predicate<? super Animal> filtroPorHabitat = animal -> animal.getHabitate().equals(habitate);
        List<Animal> animaisDoHabitat = animais.stream().filter(filtroPorHabitat).collect(Collectors.toList());
        Comparator<? super Animal> comparadorTempoVida = (animal1, animal2) -> animal1.getTotalVida() - animal2.getTotalVida();
        Animal animal = animaisDoHabitat.stream().collect(Collectors.maxBy(comparadorTempoVida)).orElse(null);
        return animal;
    }

    private Animal buscarAnimalPorNome() {
        // SISTEMA DE BUSCA
        saida.println("\nDigite o nome do animal a ser pesquisado: ");
        String nome = entrada.next();
        for (int i = 0; i < animais.size(); i++) {
            Animal animal = animais.get(i);
            if (animal.getNome().equals(nome)) {
                return animal;
            }
        }
        return null;
    }

    private void cadastrarAnimais() {
        saida.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR");
        int resp = entrada.nextInt();

        // INCLUSÃO DE ARRAYLIST
        while (resp != 0) {

            saida.println("Digite o codigo do animal: ");
            int codigo = entrada.nextInt();
            saida.println("Digite o nome do animal: ");
            String nome = entrada.next();
            saida.println("Qual o peso do animal: ");
            float peso = entrada.nextFloat();
            saida.println("Digite a idade do animal: ");
            int idade = entrada.nextInt();
            saida.println("Digite quanto tempo este animal vive: ");
            int total = entrada.nextInt();
            saida.println("Digite o habitate animal: ");
            String habitate = entrada.next();
            saida.println("Digite a data do cadastro: ");
            int data = entrada.nextInt();
            Animal animal = new Animal(codigo, nome, peso, idade, total, habitate, data);
            animais.add(animal);
            saida.println("DIGITE 1 PARA CADASTRAR E 0 PARA SAIR: ");
            resp = entrada.nextInt();
        }
    }
}
Criado 13 de outubro de 2018
Ultima resposta 30 de out. de 2018
Respostas 29
Participantes 5