Porównanie int z enum

0

Witam,
piszę kod programu który ma wczytać od użytkownika wiek a następnie wyświetlić na ekranie informację w jakiej fazie życia aktualnie znajduję się użytkownik.
Do pobrania danych od użytkownika użyłem scanner pobrany typ danych int, zaś dla faz życia użyłem typu enum. Niestety nie działa...
Mógłby ktoś podpowiedzieć mi co robię nie tak? Tak naprawdę dopiero zaczynam swoją przygodę z java.

Mój kod:

package com.company;

public enum Phase {

    BABY(0),
    CHILD(1),
    YOUTH(13),
    ADULT_18_25(18),
    ADULT_26_35(26),
    ADULT_36_45(36),
    ADULT_46_55(46),
    ADULT_56_65(56),
    SENIOR(66);

    private int value;

    Phase(int value) {
        this.value = value;
    }



    public int getPhase() {
        if ((value > BABY) && (value < CHILD))
            return BABY;

        else if ((value >= CHILD) && (value < YOUTH))
            return CHILD;

        else if ((value >= YOUTH) && (value < ADULT_18_25))
            return YOUTH;

        else if ((value >= ADULT_18_25) && (value < ADULT_26_35))
            return ADULT_18_25;

        else if ((value >= ADULT_26_35) && (value < ADULT_36_45))
            return ADULT_26_35;

        else if ((value >= ADULT_36_45) && (value < ADULT_46_55))
            return ADULT_36_45;

        else if ((value >= ADULT_46_55) && (value < ADULT_56_65))
            return ADULT_46_55;

        else if ((value >= ADULT_56_65) && (value < SENIOR))
            return ADULT_56_65;

        else if ((value > SENIOR))
            return SENIOR;

    }

}
package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.printf("Wprowadz wiek: ");
        int age = scanner.nextInt();

        Phase phase = new Phase(age);
        phase.getPhase();

        switch(age) {

            case Phase.BABY:
                System.out.printf("Jestes w fazie niemowle");
                break;

            case Phase.CHILD:
                System.out.printf("Jestes w fazie dziecko");
                break;

            case Phase.YOUTH:
                System.out.println("Jestes w fazie mlodziez");
                break;

            case Phase.ADULT_18_25:
                System.out.println("Jestes w wieku 18 - 25");
                break;

            case Phase.ADULT_26_35:
                System.out.println("Jestes w wieku 26 - 35");
                break;

            case Phase.ADULT_36_45:
                System.out.println("Jestes w wieku 36 - 45");
                break;

            case Phase.ADULT_46_55:
                System.out.println("Jestes w wieku 46 - 55");
                break;

            case Phase.ADULT_56_65:
                System.out.println("Jestes w wieku 56 - 65");
                break;

            case Phase.SENIOR:
                System.out.println("Masz powyzej 65");
                break;

            default:
                break;

        }
    }
}

0

Dodaj getValue do enuma i posługuj się tą metodą.

public int getValue() {
        return value;
    }
0

Możesz też zamienić BABY na BABY.value,...

0

Nie pomoglo...

package com.company;

public enum Phase {

    BABY(0),
    CHILD(1),
    YOUTH(13),
    ADULT_18_25(18),
    ADULT_26_35(26),
    ADULT_36_45(36),
    ADULT_46_55(46),
    ADULT_56_65(56),
    SENIOR(66);

    private int value;

    public Phase(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public int getPhase() {
        if ((value > BABY) && (value < CHILD))
            return BABY;

        else if ((value >= CHILD) && (value < YOUTH))
            return CHILD;

        else if ((value >= YOUTH) && (value < ADULT_18_25))
            return YOUTH;

        else if ((value >= ADULT_18_25) && (value < ADULT_26_35))
            return ADULT_18_25;

        else if ((value >= ADULT_26_35) && (value < ADULT_36_45))
            return ADULT_26_35;

        else if ((value >= ADULT_36_45) && (value < ADULT_46_55))
            return ADULT_36_45;

        else if ((value >= ADULT_46_55) && (value < ADULT_56_65))
            return ADULT_46_55;

        else if ((value >= ADULT_56_65) && (value < SENIOR))
            return ADULT_56_65;

        else if ((value > SENIOR))
            return SENIOR;

    }

}


package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.printf("Wprowadz wiek: ");
        int age = scanner.nextInt();

        Phase phase = new Phase();
        phase.getValue(age);

        switch(age) {

            case Phase.BABY:
                System.out.printf("Jestes w fazie niemowle");
                break;

            case Phase.CHILD:
                System.out.printf("Jestes w fazie dziecko");
                break;

            case Phase.YOUTH:
                System.out.println("Jestes w fazie mlodziez");
                break;

            case Phase.ADULT_18_25:
                System.out.println("Jestes w wieku 18 - 25");
                break;

            case Phase.ADULT_26_35:
                System.out.println("Jestes w wieku 26 - 35");
                break;

            case Phase.ADULT_36_45:
                System.out.println("Jestes w wieku 36 - 45");
                break;

            case Phase.ADULT_46_55:
                System.out.println("Jestes w wieku 46 - 55");
                break;

            case Phase.ADULT_56_65:
                System.out.println("Jestes w wieku 56 - 65");
                break;

            case Phase.SENIOR:
                System.out.println("Masz powyzej 65");
                break;

            default:
                break;

        }
    }
}


0

screenshot-20171017161616.png

0

Do switch wstawiasz age a powinieneś phase.getPhase(). Dodatkowo źle tworzysz to Phase i getValue Ci nie potrzebne.

0

Nie zastosowałeś się do żadnej rady, nic dziwnego, że nie pomogło.

0

Dodałem getValue do enuma i wywołałem ja w klasie z main

0

W klasie Phase podczas porównywania inta z enumem, też musisz korzystać z tej metody. Mniej pisania jest przy moim sposobie (nowa metoda jest niepotrzebna):


    public int getPhase() {
        if ((value > BABY.value) && (value < CHILD.value))
    return BABY.value;
0

Bez skutku, chyba ze dalej cos zle robie...

 
package com.company;

public enum Phase {

    BABY(0),
    CHILD(1),
    YOUTH(13),
    ADULT_18_25(18),
    ADULT_26_35(26),
    ADULT_36_45(36),
    ADULT_46_55(46),
    ADULT_56_65(56),
    SENIOR(66);

    private int value;

    private Phase(int value) {
        this.value = value;
    }

    public int getPhase() {
        if ((value > BABY.value) && (value < CHILD.value))
            return BABY;

        else if ((value >= CHILD.value) && (value < YOUTH.value))
            return CHILD;

        else if ((value >= YOUTH.value) && (value < ADULT_18_25.value))
            return YOUTH;

        else if ((value >= ADULT_18_25.value) && (value < ADULT_26_35.value))
            return ADULT_18_25;

        else if ((value >= ADULT_26_35.value) && (value < ADULT_36_45.value))
            return ADULT_26_35;

        else if ((value >= ADULT_36_45.value) && (value < ADULT_46_55.value))
            return ADULT_36_45;

        else if ((value >= ADULT_46_55.value) && (value < ADULT_56_65.value))
            return ADULT_46_55;

        else if ((value >= ADULT_56_65.value) && (value < SENIOR.value))
            return ADULT_56_65;

        else if ((value > SENIOR.value))
            return SENIOR;

    }

}



package com.company;

import java.util.Scanner;

public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner(System.in);

       System.out.printf("Wprowadz wiek: ");
       int age = scanner.nextInt();

       Phase phase = new Phase(age);
       phase.getPhase();

       switch(phase.getPhase()) {

           case Phase.BABY:
               System.out.printf("Jestes w fazie niemowle");
               break;

           case Phase.CHILD:
               System.out.printf("Jestes w fazie dziecko");
               break;

           case Phase.YOUTH:
               System.out.println("Jestes w fazie mlodziez");
               break;

           case Phase.ADULT_18_25:
               System.out.println("Jestes w wieku 18 - 25");
               break;

           case Phase.ADULT_26_35:
               System.out.println("Jestes w wieku 26 - 35");
               break;

           case Phase.ADULT_36_45:
               System.out.println("Jestes w wieku 36 - 45");
               break;

           case Phase.ADULT_46_55:
               System.out.println("Jestes w wieku 46 - 55");
               break;

           case Phase.ADULT_56_65:
               System.out.println("Jestes w wieku 56 - 65");
               break;

           case Phase.SENIOR:
               System.out.println("Masz powyzej 65");
               break;

           default:
               break;

       }
   }
}
0

screenshot-20171017164241.png

0

Sorry, opuściłem value.

    public int getPhase() {
        if ((value > BABY.value) && (value < CHILD.value))
    return BABY.value;
0

Metoda getPhase ma niby zwracać int, ale zwraca Phase...

0

Bylo dobrze nie potrzbnie na forum zamienilem int na phase. Ale i tak nie dziala, caly czas ten sam blad

0
package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.printf("Wprowadz wiek: ");
        int age = scanner.nextInt();

        Phase phase = new Phase(age);
        phase.getPhase();

        switch(phase.getPhase()) {

            case Phase.BABY.:
                System.out.printf("Jestes w fazie niemowle");
                break;

            case Phase.CHILD:
                System.out.printf("Jestes w fazie dziecko");
                break;

            case Phase.YOUTH:
                System.out.println("Jestes w fazie mlodziez");
                break;

            case Phase.ADULT_18_25:
                System.out.println("Jestes w wieku 18 - 25");
                break;

            case Phase.ADULT_26_35:
                System.out.println("Jestes w wieku 26 - 35");
                break;

            case Phase.ADULT_36_45:
                System.out.println("Jestes w wieku 36 - 45");
                break;

            case Phase.ADULT_46_55:
                System.out.println("Jestes w wieku 46 - 55");
                break;

            case Phase.ADULT_56_65:
                System.out.println("Jestes w wieku 56 - 65");
                break;

            case Phase.SENIOR:
                System.out.println("Masz powyzej 65");
                break;

            default:
                break;

        }
    }
}

package com.company;

public enum Phase {

    BABY(0),
    CHILD(1),
    YOUTH(13),
    ADULT_18_25(18),
    ADULT_26_35(26),
    ADULT_36_45(36),
    ADULT_46_55(46),
    ADULT_56_65(56),
    SENIOR(66);

    private int value;

    private Phase(int value) {
        this.value = value;
    }

    public int getPhase() {
        if ((value > BABY.value) && (value < CHILD.value))
            return BABY.value;

        else if ((value >= CHILD.value) && (value < YOUTH.value))
            return CHILD.value;

        else if ((value >= YOUTH.value) && (value < ADULT_18_25.value))
            return YOUTH.value;

        else if ((value >= ADULT_18_25.value) && (value < ADULT_26_35.value))
            return ADULT_18_25.value;

        else if ((value >= ADULT_26_35.value) && (value < ADULT_36_45.value))
            return ADULT_26_35.value;

        else if ((value >= ADULT_36_45.value) && (value < ADULT_46_55.value))
            return ADULT_36_45.value;

        else if ((value >= ADULT_46_55.value) && (value < ADULT_56_65.value))
            return ADULT_46_55.value;

        else if ((value >= ADULT_56_65.value) && (value < SENIOR.value))
            return ADULT_56_65.value;

        else if ((value > SENIOR.value))
            return SENIOR.value;

    }

}

0

screenshot-20171017170404.png
screenshot-20171017170420.png

0

Jeżeli zmieniłeś, to teraz pewnie zwraca jakiś inny błąd, np. brak return w metodzie :)

0
bogdans napisał(a):

Sorry, opuściłem value.

    public int getPhase() {
        if ((value > BABY.value) && (value < CHILD.value))
    return BABY.value;

Zrobiłem tak, dalej nie działa. Co jeszcze źle robię, bo już teraz nie rozumiem.

0
Mattteuszzz napisał(a):

Zgadza się, więc co dalej źle robie?

Myślę, że zasadniczym błędem jest programowanie w sytuacji gdy się nie zna podstaw języka i nie rozumie, co się tak naprawdę robi :)

  1. Metoda, która ma określony zwracany typ musi zawsze coś zwracać. Tymczasem metoda którą napisałeś zwraca coś tylko w razie spełnienia warunku.
  2. Enuma się w ten sposób nie tworzy Phase phase = new Phase(age); to nie jest klasa...
0

Podstawy w teorii mam, nie wszystko rozumiem dlatego programuję, aby tych podstaw nauczyć się w praktyce (proszę przypomnieć sobie swoje początki). Odnośnie 1 to chyba rozumiem, jeżeli zawsze musi coś zwracać więc wystarczy, że po warunkach return 0.

Czyli w przypadku pisanego przeze mnie kodu nie ma sensu używać typu enum?

0

Nie miałem na myśli tego, że enum jest bez sensu, bardziej twój kod jest bez sensu. Operator new stosuje się do utworzenia instancji obiektu jakiejś klasy, a nie używa się do enuma. Nie można stworzyć instancji enuma. Ponadto metody enuma woła się na konkretnym enumie.

Przykładowo

enum Animal {
    DOG,
    CAT;
    
    public String voice() {
        return "meow";
    }
}

System.out.println(CAT.voice());
0

Jasne ja rozumiem to, po prostu błędnie zrównoważyłem enum (typ) z klasą, przez co próbowałem stworzyć obiekt typu...

A mógłbyś mi zasugerować czego powinienem użyć aby stworzyć switcha warunkującego daną faze życia? Można tutaj użyć enum czy po prostu użyc np. final int baby = 0, final int child = 1?

Próbowałem użyć enum ponieważ wydawał mi sie bardziej przejrzysty. A javy uczę się dopiero od miesiąca, więc początkowe błędy później zaprocentują bo przez to będę rozumiał.

0

Kod napisałem przy zastosowaniu if a także podczytanych wartości final int z klasy Phase.
Program działa, mam nadzieję, że wraz z nauką zrozumiem jak to zrobić ze switch-em.

package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.printf("Wprowadz wiek: ");
        int age = scanner.nextInt();

        Phase phase = new Phase();

        if ((age > phase.baby) && (age < phase.child)) {
            System.out.println("Jestes w fazie niemowle");

        } else if ((age >= phase.child) && (age < phase.youth)) {
            System.out.println("Jestes w fazie dziecko");

        } else if ((age >= phase.youth) && (age < phase.adult_18_25)) {
            System.out.println("Jestes w fazie mlodziez");

        } else if ((age >= phase.adult_18_25) && (age < phase.adult_26_35)) {
            System.out.println("Jestes w fazie 18 - 25");

        } else if ((age >= phase.adult_26_35) && (age < phase.adult_36_45)) {
            System.out.println("Jestes w fazie 26 - 35");

        } else if ((age >= phase.adult_36_45) && (age < phase.adult_46_55)) {
            System.out.println("Jestes w fazie 36 - 45");

        } else if ((age >= phase.adult_46_55) && (age < phase.adult_56_65)) {
            System.out.println("Jestes w fazie 46 - 55");

        } else if ((age >= phase.adult_56_65) && (age < phase.senior)) {
            System.out.println("Jestes w fazie 56 - 65");

        } else if ((age > phase.senior)) {
            System.out.println("Jestes w fazie powyzej 65");
        }
    }
}
package com.company;

public class Phase {

        final int baby = 0;
        final int child = 1;
        final int youth = 13;
        final int adult_18_25 = 18;
        final int adult_26_35 = 26;
        final int adult_36_45 = 36;
        final int adult_46_55 = 46;
        final int adult_56_65 = 56;
        final int senior = 66;

        Phase() {}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1