Problem początkującego z zadaniem

0

Cześć

Mam zadanie, które sprawia mi duże problemy. Spróbuje opisać z czym się zmagam, uczę się dopiero jezyka javy, więc prosiłbym o wskazówki.i wyrozumiałość
Stwórzyłem klasy:

  • zwierze, która ma imię, wiek i może dać głos
  • pies, która ma rasę i daje głos.
  • lis, która ma kolor i daje głos
  • kot, która ma umaszczenie i daje głos

Mam kilka probłemów:

  1. Jak znaleŹć zwierze które jest najstarsze??
  2. Mam kłopot z tym, że nie wiem jak sobie poradzić by zabiezpieczyć klasę zwierzę aby nie dało sie stworzyć zwierzęcia z wiekiem ujemnym, a jeśli jest wiek ujemny to niech rzuci wyjatkiem InvalidAnimalAgeException, przeprowadzić tutaj symulacje z trycatch i pokazać przechwycenie wyjatku i jego obsluge.
  3. Rasy psa powinny byc typem wyliczeniowym, dostepne sa rasy Psa: Jork, Jamnik, Wilk.

Póki co stworzyłem wymienione klasy czyli zwierze, pies, lis, kot i klasę Main, a dalej utknąłem. Proszę o wskazówki bardziej doświadczonych Kolegów.

   public class Zwierze {



    private String imie;
    private int wiek;

    public Zwierze(String imie, int wiek) {
        this.imie = imie;
        this.wiek = wiek;
    }

    public String getImie() {
        return imie;
    }

    public void setImie(String imie) {
        this.imie = imie;
    }

    public int getWiek() {
        return wiek;
    }

    public void setWiek(int wiek) {
        this.wiek = wiek;
    }

    public void dajGlos(){
            System.out.println("Daj głos");

        }

    @Override
    public String toString() {
        return "Zwierze{" +
                "imie='" + imie + '\'' +
                ", wiek=" + wiek +
                '}';
    }
}


public class Kot extends Zwierze{



    private String umaszczenie;

    public Kot(String imie, int wiek) {
        super(imie, wiek);
    }


    public void dajGlos() {
        super.dajGlos();
        System.out.println("miau miau");
    }

    @Override
    public String toString() {
        return super.toString()+ ", umaszczenie=" + umaszczenie;
    }



public class Pies extends Zwierze{



    private String rasa;

    public Pies(String imie, int wiek) {
        super(imie, wiek);
    }

    public void dajGlos() {
        super.dajGlos();
        System.out.println("hau hau");
    }

    @Override
    public String toString() {
        return super.toString()+ ", rasa=" + rasa;
    }
}


public class Lis extends Zwierze{



    private String kolor;

    public Lis(String imie, int wiek) {
        super(imie, wiek);
    }


    public void dajGlos() {
        super.dajGlos();
        System.out.println("lititititit");
    }

    @Override
    public String toString() {
        return super.toString()+ ", kolor=" + kolor;
    }
}
1

Chyba faktycznie kolos ale na uczelni :)

Ad.1) Stwórz listę (albo inną kolekcję np. zbiór) sparametryzowaną typem Twojej klasy bazowej, przeiteruj po niej to znajdziesz najmniejszą wartość (możesz też użyć strumieni).
Ad.2) Możesz to zrobić po prostu w konstruktorze.
Ad.3) Ma być enum a w klasie Pies rasę zadeklarowałeś jako String. Czemu? Stwórz enuma i typ pola ustaw jako ten typ wyliczeniowy zamiast stringa.

1

Jak znaleŹć zwierze które jest najstarsze??

Prawdopodobnie chodzi tutaj o stworzenie kilku obiektów, zapisanie ich np. w tablicy a następnie np. pętlą for sprawdzenie których z nich ma najwiekszy wiek (getWiek())
Miałeś takie rzeczy? (obiekt, tablica, pętla)

0

@RequiredNickname: ad3. stworzyłem nową klasę enum, która nazywa się RasyPsa i tam podałęm kilka ras. Dodałęm też prywatnego stringa o nazwie skrót.
Jeśli dobrze rozumiem to ma teraz w klasie Pies dodać enum RasyPsa??

0

`Tak teraz wygląda klasa Pies i enum Rasy Psa

``

public class Pies extends Zwierze{

private RasyPsa rasyPsa;

public Pies(String imie, int wiek, RasyPsa rasyPsa) {
    super(imie, wiek);
    this.rasyPsa = rasyPsa;
}

public Pies(String imie, int wiek) {
    super(imie, wiek);
}

public void dajGlos() {
    super.dajGlos();
    System.out.println("hau hau");
}

@Override
public String toString() {
    return super.toString()+ ", rasyPsa=" + rasyPsa;
}






public enum RasyPsa {

SAMOYED("Samo"),
JORK("Jork"),
JAMNIK("Jam"),
WILK("W"),


private String skrót;

RasyPsa(String skrót) { this.skrót = skrót; }

public String getSkrót() {return skrót;}

```
1

Dobrze ci idzie, możesz teraz usunąć ten konstruktor aby nie móc stworzyć psa który nie ma rasy

public Pies(String imie, int wiek) {
    super(imie, wiek);
}

powinieneś teraz dodać do konstruktora sprawdzenie podanego wieku Zwierzaka i rzucenie wyjątku

0

w klasie Main dodałęm zwierzaki ale właśnie jak znaleźć najstarsze zwierzę i zabiezpieczyć klasę Zwierzę??


     public static void main(String[] args) {



        Lis lis = new Lis("lis", 4);
        Kaczka kaczka = new Kaczka("kaczka", 3);
        Kot kot = new Kot("kot", 9);
        Pies pies = new Pies("pies", 33);


        Zwierze[] zwierzes = new Zwierze[4];
        zwierzes[0] = lis;
        zwierzes[1] = kaczka;
        zwierzes[2] = kot;
        zwierzes[3] = pies;
        for (Zwierze v : zwierzes) {
            v.dajGlos();
1

Najwyższy wiek to tylko przypisujesz pierwszy wiek z listy do jakiejś zmiennej i w pętli sprawdzasz czy wiek jest wyższy od tego który jest w tej zmiennej

Zwierze[] zwierzes = new Zwierze[4];
zwierzes[0] = lis;
zwierzes[1] = kaczka;
zwierzes[2] = kot;
zwierzes[3] = pies;

int highestAge = zwierzes[0].wiek;

foreach (Zwierze v : zwierzes) {
    v.dajGlos();
    if (v.wiek > highestAge)
    {
        highestAge = v.wiek;
    }
}
0

dzięki @pavarotti poradziłem sobie z tym późną nocą. Dodałem tez metodę toString do każdej klasy, która wypisuje wszystkie parametry danego zwierzaka, ładniejsze dla oka:).

Nie potrafię rozgryźć zagadnienia z zabezpieczeniem klasy zwierze aby nie dało się stworzyć zwierzęcia z ujemnym wiekiem. A dalej pokazać symulację trycatch i przechwycenie wyjatku i jakas jego obsluge.

Panowie macie jakieś wskazówki? Jak wyglądałby taki kod??

0

Albo deklarujesz typ zmiennej uint i wtedy z automatu nie może mieć ujemnych - dobra wyczytałem że w Javie nie ma unsigned intów.
W takim razie sprawdzasz ifem czy nie jest ujemna:

if (age >=0)
{
    //do something
}

Albo robisz pętlę która się wykona dopiero jeśli liczba będzie >= 0:

do
{
    int age = int.Parse(Console.ReadLine());
} while (age >= 0);

Możesz napisać metodę:

public bool IsPosivite(int number)
    => number >= 0;

i gdzieś to potem sprawdzać.
A no i ja w C# Ci daje rozwiązanie, Ty musisz to napisać tak jak Ci pasuje.

0

Panowie ktoś mógłby spojrzeć na ten kod i wskazać gdzie jest błąd?? Chodzi o to by wskazać najstarsze zwierze.
Kompletnie pogubiłem się w temacie wyjątków w tym zadaniu, pomimo pomocy @pavarotti nic mi nie wychodzi.
Jak ogarnąć ten temat??

        Lis lis = new Lis("lis", 4, "Czarny");
        Kaczka kaczka = new Kaczka("kaczka", 3, 33);
        Kot kot = new Kot("kot", 9, "Ciemne");
        Pies pies = new Pies("pies", 33,RasyPsa.JAMNIK);


      

      Zwierze[] zwierzes = new Zwierze[4];
        zwierzes[0] = lis;
        zwierzes[1] = kaczka;
        zwierzes[2] = kot;
        zwierzes[3] = pies;

        int najstarszeZwierze = zwierzes[0].getWiek();


        for (Zwierze v : zwierzes) {
            v.dajGlos();
            if (v.getWiek() > najstarszeZwierze) {
                najstarszeZwierze = v.getWiek();
            }

        }
1

@ElKolos99: W momencie kiedy znajdujesz wiek najstarszego zwierzęcia to musisz je także przechować, aby móc później wypisać:

int najstarszeZwierze = zwierzes[0].getWiek();
Zwierze najstarszeZwierzeObiekt = zwierzes[0];
        for (Zwierze v : zwierzes) {
            v.dajGlos();
            if (v.getWiek() > najstarszeZwierze) {
                najstarszeZwierze = v.getWiek();
                najstarszeZwierzeObiekt = v;
            }
        }
//Twoim najstaszym zwierzęciem jest teraz najstarszeZwierzeObiekt 
//w wieku najstarszeZwierze (popracuj na nazwami zmiennych oraz spróbuj to wypisać korzystając z funkcji System.out.println(...))
//aby znalezc imie zwierzęcia prawdopodobnie musisz skorzystać z funkcji zwracającej imie, getImie() (analogicznie jak dla getWiek()) 
1
public interface GiveAVoice {
    void giveAVoice();
}
public abstract class Animal implements GiveAVoice {
    private final String name;
    private final Integer age;

    public Animal(final String name, final Integer age) {
        validateAnimalAge(age);
        this.name = name;
        this.age = age;
    }

    private void validateAnimalAge(final int age) {
        if (age < 0) {
            throw new InvalidAnimalAgeException();
        }
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }
}

public class Cat extends Animal {
    private final Umaszczenie umaszczenie;

    public Cat(final String name, final Integer age, final Umaszczenie umaszczenie) {
        super(name, age);
        this.umaszczenie = umaszczenie;
    }

    @Override
    public void giveAVoice() {
        System.out.println("Meow");
    }

    public Umaszczenie getUmaszczenie() {
        return umaszczenie;
    }
}

public class Dog extends Animal {
    private final Breed breed;

    public Dog(final String name, final Integer age, final Breed breed) {
        super(name, age);
        this.breed = breed;
    }

    @Override
    public void giveAVoice() {
        System.out.println("Bark Bark!");
    }
}

public class Fox extends Animal {
    private final Color color;

    public Fox(final String name, final Integer age, final Color color) {
        super(name, age);
        this.color = color;
    }

    @Override
    public void giveAVoice() {
        System.out.println("What does the fox say?");
    }

    public Color getColor() {
        return color;
    }
}

public static void main(String[] args) {
        Dog dog = new Dog("Burek", 1, Breed.MONGREL);
        Fox fox = new Fox("Lisek Chytrusek", 2, Color.GINGER);
        Cat cat = new Cat("Filemon", 3, Umaszczenie.W_KROPKI);

        List<Animal> animalList = List.of(dog, fox, cat);
        Animal staryDziad = animalList.stream()
                .max(Comparator.comparing(Animal::getAge))
                .orElseThrow(NoSuchElementException::new);

        System.out.printf("Stary dziad to %s i ma %d lat", staryDziad.getName(), staryDziad.getAge());
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.