Java, exercício de análise

assunto: map, hashmap
Pergunta:
Pretende-se um programa destinado a modelizar um conjunto de pássaros, especificamente canários e periquitos. Em termos de funcionalidades requeridas, apenas se pretende inserir novas instâncias de pássaros e manter um mapeamento entre os tipos e as respectivas quantidades. Sendo assim, complete o código da Listagem C de modo a que o resultado da sua execução seja: {Piriquito=10, Canario=10}. A classe Passaro encontra-se declarada como abstracta de modo a não poder ser instanciada, não sendo necessário alterá-la. As classes Periquito e Canario requerem a redefinição dos seguintes métodos: String toString(), boolean equals(Object o) e int hashCode().
A interface Map, sendo K o tipo da chave e V o tipo do valor associado, inclui, entre outros, os métodos V put(K k, V v) e V get(Object k). Ambos devolvem o valor associado à chave k fornecida, antes de substituir o valor já existente pelo novo valor v fornecido no caso do put, ou null caso esta não seja encontrada.

package recursopa2;

import java.util.HashMap;
import java.util.Map;

abstract class Passaro {

    public static String PASSARO = "Passaro";
    public static String PERIQUITO = "Periquito";
    public static String CANARIO = "Canario";

    //fabrica de objectos
    public static Passaro criaPassaro(String tipoPassaro) {
        if (tipoPassaro.equalsIgnoreCase(PERIQUITO)) {
            return new Periquito();
        } else if (tipoPassaro.equalsIgnoreCase(CANARIO)) {
            return new Canario();
        } else {
            return null;
        }
    }
}

class Periquito extends Passaro {

    public String toString() {
        return "Periquito";
    }

    public boolean equals(Object ob) {
        //return ob instanceof Periquito;
        //ou em alternativa
        return getClass() == ob.getClass();
    }

    public int hashCode() {
        return PERIQUITO.hashCode();
    }
}

class Canario extends Passaro {

    public String toString() {
        return "Canario";
    }

    public boolean equals(Object ob) {
        return ob instanceof Canario;
    }

    public int hashCode() {
        return CANARIO.hashCode();
    }
}

class MainPassaro {

    public static void adicionaPassaro(Passaro p, Map<Passaro, Integer> gaiola) {
        if (gaiola == null || p == null) {
            return;
        }

        Integer quantidade = gaiola.get(p);
        //se não tive cananrio, a quantidade vem null
        //se já tiver algum, a quantidade vair ser >0

        if (quantidade == null) {
            gaiola.put(p, 1);
            //acrescentamos um elemento novo
        } else {
            gaiola.put(p, quantidade + 1);
            //adiciono um novo, com um update quantidade
        }
    }

    public static void main2(String args[]) {
        //Map</*..f..*/> gaiola = new HashMap<>();
        //resolução:
        Map<Passaro, Integer> gaiola = new HashMap<>();

        Passaro p;

        for (int i = 0; i < 10; i++) {
            adicionaPassaro(Passaro.criaPassaro(Passaro.PERIQUITO), gaiola);
            adicionaPassaro(Passaro.criaPassaro(Passaro.CANARIO), gaiola);
        }
        System.out.println(gaiola);
    }
}

////para testar
public class main {
    public static void main(String[] args) {
        MainPassaro.main2(args);
    }
}
Tags : ,

0 thoughts on “Java, exercício de análise”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.