Pozbywanie się drabinki instrukcji IF

0

Cześć, jestem początkującym "programistą" Java/JavaFX.
Chciałbym dowiedzieć się czy istnieje sposób na zastąpienie tej drabinki IF'ów?

Funkcje spełniają swoje zadania, po prostu chcę wiedzieć czy istnieje na to lepszy sposób.

Ta funkcja pobiera wartości z dwóch pól i przypisuje odpowiednią wartość do zmiennej v i s, jeśli warunek if jest spełniony.

@FXML
    private void CalcTown(MouseEvent event) {

        String PlaneName = txtPlaneName.getValue().toString();
        String TownName = txtTown.getText();

        float v = 1;
        float s = 1;

        if(PlaneName.equals("Concord")){
            v = 1200;
        }

        if(PlaneName.equals("Boeing")){
            v = 1200;
        }

        if(PlaneName.equals("AirBus")){
            v = 800;
        }

        if(TownName.equals("Moskwa")){
            s = 600;
        }

        if(TownName.equals("Podlasie")){
            s = 300;
        }

        if(TownName.equals("Zagrzeb")){
            s = 400;
        }

        if(TownName.equals("Nowy Jork")){
            s = 2000;
        }

        if(TownName.equals("Tokyo")){
            s = 6000;
        }

        if(TownName.equals("Warszawa")){
            s = 400;
        }

        if(TownName.equals("Oslo")){
            s = 3000;
        }

        FlyTime(v,s);
    }

Funkcja ta pobiera parametry v, s, zlicza czas lotu i wpisuje go w odpowiednie pole.

@FXML
        private void FlyTime(float v, float s){
    
            float t = s/v;
            txtTime.setText(String.valueOf(t));
        }
0

Okej, przerobiłem kod na Mapę.
W jaki sposób dobrać się do drugiej wartości obok znalezionego String'a(nazwy miasta)?

String PlaneName = txtPlaneName.getValue().toString();
        String TownName = txtTown.getText();

        float v = 1;
        float s = 1;

        Map<String, Integer> towns = Map.of(
                "Moskwa", 600,
                "Podlasie", 300,
                "Zagrzeb", 400,
                "Nowy Jork", 2000,
                "Tokyo", 6000,
                "Warszawa", 400,
                "Oslo", 3000
                );
        
        
        if(Map.of().containsKey(TownName)){
            s = Map.of().get();
        }
5

po prostu towns.get("Moskwa") ;]
Takie coś if(Map.of().containsKey(TownName)){ sensu nie ma bo zrobiłeś pustą mapę przez Map.of() a potem sprawdzasz czy coś w niej jest

0

Dziękuję za pomoc, teraz wszystko działa :)

@FXML
    private void CalcTown(MouseEvent event) {

        String PlaneName = txtPlaneName.getValue().toString();
        String TownName = txtTown.getText();


        Map<String, Integer> towns = Map.of(
                "Moskwa", 600,
                "Podlasie", 300,
                "Zagrzeb", 400,
                "Nowy Jork", 2000,
                "Tokyo", 6000,
                "Warszawa", 400,
                "Oslo", 3000
                );

        float s = towns.get(TownName);

        Map<String, Integer> planes = Map.of(
                "Concord",1200,
                "Boeing",1000,
                "AirBus", 800
        );

        float v = planes.get(PlaneName);

        FlyTime(v,s);
    }

    @FXML
    private void FlyTime(float v, float s){

        float t = s/v;
        txtTime.setText(String.valueOf(t));
    }
4

NPE na horyzoncie :P

0

Dodałem "blokadę" pobierania wartości z pola txtPlaneName jeśli użytkownik jeszcze nie wybrał nic w ComboBox(txtPlaneName to ComboBox).
Dzięki temu uniknąłem NPE.

@FXML
    private void CalcTown(MouseEvent event) {

        if (!txtPlaneName.getSelectionModel().isEmpty()) {
            String PlaneName = txtPlaneName.getValue().toString();
            String TownName = txtTown.getText();

            Map<String, Integer> towns = Map.of(
                    "Moskwa", 600,
                    "Podlasie", 300,
                    "Zagrzeb", 400,
                    "Nowy Jork", 2000,
                    "Tokyo", 6000,
                    "Warszawa", 400,
                    "Oslo", 3000
            );

            float s = towns.get(TownName);

            Map<String, Integer> planes = Map.of(
                    "Concord", 1200,
                    "Boeing", 1000,
                    "AirBus", 800
            );

            float v = planes.get(PlaneName);

            FlyTime(v, s);


            }
        }


    @FXML
    private void FlyTime(float v, float s){

        float t = s/v;
        float ts = t*60;
        String sT = String.valueOf(t);
        txtTime.setText(t + " h");
    }
3

@Tacoo protipy:

  • nie ma sensu tworzenie tych samych map za każdym razem w metodzie private void CalcTown(MouseEvent event). Zrób private static final.
  • nazwy metod w Javie są z małej litery (camelCase)
3

Ja to bym przeniósł do enumów:

    enum Plane {
        AIRBUS(800),
        BOEING(1000),
        CONCORD(1200);

        private final int velocity;
        Plane(final int velocity) {
            this.velocity = velocity;
        }

        public int getVelocity() {
            return this.velocity;
        }

        public static Optional<Plane> findByName(final String name) {
            if (name == null || name.isEmpty()) {
                return Optional.empty();
            }

            String searched = name.toUpperCase();
            return Stream.of(values())
                    .filter(e -> e.name().equals(searched))
                    .findAny();
        }
    }

i potem oczywiście:

Plane plane = Plane.findByName(txtPlaneName.getSelectionModel())
                .orElseThrow(() -> new PlaneNotFoundException());

Ma to tę zaletę, że można budować selectionModele w oparciu o enum Plane.

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