do-while Schleife funktioniert nicht wie ich es möchte

hansimunglueck

Neues Mitglied
Hallo zusammen!
Ich bin erst Anfänger in Java. Ich muss als Projekt einen Währungsumrechner entwickeln. In meiner Klasse in der der Nutzer seine gewünschte Währung suchen soll, bekomme ich es nicht hin "invalid" auszugeben, falls es das Gesuchte nicht gibt. Danach soll der Nutzer nochmal etwas eingeben können, bis er eben eine der vorhandenen Währungen findet. (Ich weiß der Code ist nicht sehr schön - wurde mir schonmal gesagt - also bitte nicht meckern, wenn dann sagen, wie ich es besser machen kann ^^ )​

Java:
package com.company;

import java.util.Arrays;
import java.util.Scanner;

public class FindCurrency {

    static String finalCurrency;

    static double finalCurrencyValue;

    public static void findTheSearchedCurrency() {
        String[] currencyList = {"U.S. Dollar", "Euro", "Australian dollar", "Brunei dollar", "Canadian dollar",
                "New Zealand dollar", "Singapore dollar", "Trinidadian dollar", "U.K. Pound", "Chinese yuan", "Japanese yen", "Algerian Dinar",
                "Botswana Pula", "Brazilian real", "Chilean peso", "Czech koruna", "Danish krone",
                "Indian rupee", "Israeli New Shekel", "Korean won", "Kuwaiti dinar", "Malaysian ringgit", "Mauritian rupee", "Mexican peso",
                "Norwegian krone", "Omani rial", "Peruvian sol", "Philippine peso", "Polish zloty", "Qatari riyal",
                "Russian ruble", "Saudi Arabian riyal", "South African rand", "Swedish krona", "Swiss franc", "Thai baht",
                "U.A.E. dirham", "Uruguayan peso"};

        double[] valueList = {194.555000, 1.928500, 16.301300, 6.837700, 1.853760, 1.711910, 1154.410000, 8.949990, 31.549400,
                9.498300, 1.276790, 103.982000, 4.600090, 179.782000, 1684.980000, 0.408669, 5.885710, 58.824900, 27.525400,
                2.135180, 13.261700, 0.512085, 4.953050, 70.950200, 5.920590, 4.847830, 75.464300, 4.994330, 1.853760, 21.323700,
                13.499300, 1.329890, 46.718900, 9.001470, 4.891100, 1.101500, 1.331820, 53.384600};

        Arrays.sort(currencyList); //Array alphabetisch sortiert

        String[] upperCurrencyList = new String[currencyList.length];
        for (int index1 = 0; index1 < upperCurrencyList.length; index1++) {
            upperCurrencyList[index1] = currencyList[index1].toUpperCase(); //upperCurrency-Strings in einen String Array
        }


        Scanner scan = new Scanner(System.in);
        boolean whole = true;

        do {
            System.out.print("Which currency do u want?: ");
            String search = scan.nextLine();                    //Wahl welche Währung man möchte


            String searchToUpperCase = null;
            for (int index = 0; index < search.length(); index++) {
                if (Character.isLowerCase(search.charAt(index))) {
                    searchToUpperCase = search.toUpperCase();
                }

            }


            int i;
            for (i = 0; i < upperCurrencyList.length; i++) {
                assert searchToUpperCase != null;
                if (searchToUpperCase.equals(upperCurrencyList[i])) {
                    System.out.println(upperCurrencyList[i]);
                    whole = true;
                } else if (upperCurrencyList[i].contains(searchToUpperCase)) {
                    System.out.print(i + ": " + upperCurrencyList[i] + "\n");
                    whole = true;
                } else if (!upperCurrencyList[i].contains(searchToUpperCase)) {
                    System.err.println("invalid");
                    whole = false;
                }
            }
        } while (!whole);


        System.out.print("Type in number for the currency you want: ");
        int currencyFinal = scan.nextInt();


        finalCurrency = upperCurrencyList[currencyFinal];
        finalCurrencyValue = valueList[currencyFinal];


    }
}
 
Beste Antwort
Die for-Schleife ab Zeile 52 dient dazu, die Währung zu finden. Jetzt wäre es doch schön, wenn das Ergebnis dieser Schleife z. B. wäre: ja, hab ich gefunden oder nein, hab ich nicht gefunden.

Dazu hast Du ein boolean whole (warum whole?!?) und das einzige, was Du tun musst, ist whole vor der Schleife mit false zu initialisieren und die Zeilen 60 bis 62 (EDIT: korrigiert) zu entfernen.

D. h. vor der Schleife gehst Du davon aus, dass der Begriff nicht gefunden wird und falls sich in der Schleife das Gegenteil herausstellt, stellst Du whole auf true um.

Nach der Schleife weißt Du somit, ob der Spaß enthalten war oder nicht.
In meiner Klasse in der der Nutzer seine gewünschte Währung suchen soll, bekomme ich es nicht hin "invalid" auszugeben, falls es das Gesuchte nicht gibt.
Also bei mir funktioniert dein Code. Wenn ich z.B. "yyyyyy" eingebe, dann wird 38 Mal auf der Konsole "invalid" ausgegeben und dann der User nach einer neuen Eingabe gefragt.

Welche ganz konkrete Eingabe tätigst du denn, wobei du erwarten würdest, dass er die Currency nicht findet, sie aber dennoch findet?
Kann es sein, dass du einfach einen Buchstaben eingibst, der aber durch die Abfrage von upperCurrencyList[i].contains(searchToUpperCase) dann eben doch als Teil einer vorhandenen Currency enthalten ist?
 
Die for-Schleife ab Zeile 52 dient dazu, die Währung zu finden. Jetzt wäre es doch schön, wenn das Ergebnis dieser Schleife z. B. wäre: ja, hab ich gefunden oder nein, hab ich nicht gefunden.

Dazu hast Du ein boolean whole (warum whole?!?) und das einzige, was Du tun musst, ist whole vor der Schleife mit false zu initialisieren und die Zeilen 60 bis 62 (EDIT: korrigiert) zu entfernen.

D. h. vor der Schleife gehst Du davon aus, dass der Begriff nicht gefunden wird und falls sich in der Schleife das Gegenteil herausstellt, stellst Du whole auf true um.

Nach der Schleife weißt Du somit, ob der Spaß enthalten war oder nicht.
 
Beste Antwort
also zuerst zu deinem problem...

du hast das im moment
Java:
tu

// aber du brichst nicht ab, deswegen wirds trotzdem 30 mal durchgelatscht
for( 30 mal )
{
    irgendwas = false;
}
während(irgendwas)
du kannst zb

Code:
 else if (!upperCurrencyList[i].contains(searchToUpperCase)) {
                        System.err.println("invalid");
                        whole = false;
                        break;
                    }
damit "brichst" du die for schleife, damit gibst du nicht 30 mal invalid aus, dafür läufst du in die nächste exception aber das ist dann wieder dein problem ( um genau zu sein... dein versuch es da auf false zu setzen funktioiniert so nicht... wenn es nicht das erste ist bricht es sofort ab😀)
zu deinem code
ich denke dein hauptproblem an dem code ist dass du nicht weist was es gibt , du kannst zb strings vergleichen mit
boolean ergebnis = search.equalsIgnoreCase(currencyList);

damit sparst du dir den ganzen upper case kram und das char at... was zielführend ist, aber warum umständlich wenns einfach geht

dass dein code "nicht schön ist" liegt halt auch daran dass du sehr wahrscheinlich noch keine klassen hattest .. dafür ist halt java nicht ausgelegt aber am anfang ist es so
 
damit "brichst" du die for schleife, damit gibst du nicht 30 mal invalid aus,
Was aber genau das Falsche sein dürfte. Es geht ja darum zu suchen. Invalid wäre es ja nur, wenn kein Element nicht stimmen würde.

Der Ansatz muss also sein:
  • Vorbelegung setzen - also z.B. ein gefunden := false
  • Dann Elemente durchsuchen, wenn ein Element gefunden wird, dann gefunden := true, hier kann man dann auch abbrechen.
  • Nach der Schleife hätte man dann in gefunden ein true bzw. false.

Generell wäre hier wie immer mein Tipp: Unterteile den Code. Das ist dann deutlich einfacher. Das kann dann sowas sein:
Java:
public boolean arrayContains (String[] elements, String search) {
    for (int index = 0; index < elements.length; index++) {
        if (elements[index].equalsIgnoreCase(search)) return true;
    }
    return false;
}

Daran kann man dann erkennen: Bei einem Vergleich von Strings kann man auch equalsIgnoreCase nutzen statt alles umzuwandeln.

Dann noch ein paar Hinweise:
Java:
            String searchToUpperCase = null;
            for (int index = 0; index < search.length(); index++) {
                if (Character.isLowerCase(search.charAt(index))) {
                    searchToUpperCase = search.toUpperCase();
                }

            }
Hier wird nur dann in searchToUpperCase ein Wert eingetragen, wenn mindestens ein Buchstabe ein Kleinbuchstabe ist. Und bei mehreren, dann wird das mehrfach gemacht. Das ist so natürlich Unnötig. Da reicht ein einfaches:
String searchToUpperCase = search.toUpperCase();

(Aber wie gesagt: braucht man nicht!)

Dann ein weiterer Punkt: Gehören valueList und currencyList zusammen? Also sind das Werte zu den einzelnen Währungen?
Sollte das der Fall sein, dann ist das natürlich nach dem Arrays.sort(currencyList); hinfällig. Dann hast Du ja an den einzelnen Positionen andere Werte und damit würde currency an Position 1 nicht mehr zu dem value an Position 1 gehören...
(Hier wäre der Ansatz, dass man Dinge, die zusammen gehören, auch zusammen packt. Aber das wird vermutlich noch zu viel für Dich sein, da Du Java erst lernst.)

Das wären noch so ein paar Hinweise von meiner Seite.
 
Was aber genau das Falsche sein dürfte.
ja aber das war was er versucht hat und repariert haben wollte.. habe repariert und nun kann er selber weiter suchen und rum werkeln.... ich hab ja geschrieben dass er dann in das nächste problem läuft und sich was anderes überlegen müsste...

um genau zu sein... dein versuch es da auf false zu setzen funktioiniert so nicht... wenn es nicht das erste ist bricht es sofort ab😀
 
Also bei mir funktioniert dein Code. Wenn ich z.B. "yyyyyy" eingebe, dann wird 38 Mal auf der Konsole "invalid" ausgegeben und dann der User nach einer neuen Eingabe gefragt.

Welche ganz konkrete Eingabe tätigst du denn, wobei du erwarten würdest, dass er die Currency nicht findet, sie aber dennoch findet?
Kann es sein, dass du einfach einen Buchstaben eingibst, der aber durch die Abfrage von upperCurrencyList[i].contains(searchToUpperCase) dann eben doch als Teil einer vorhandenen Currency enthalten ist?
Da habe ich mich etwas zu ungenau ausgedrückt. Ich möchte, dass es nur einmal "invalid" ausgibt, falls im gesamten Array kein einziger Wert übereinstimmt. Danach soll der Nutzer nochmal gefragt werden, welche Währung er sucht.
Falls aber ein Wert übereinstimmt, dann soll es nur diesen einen Wert printen. Und falls mehrere Werte übereinstimmen, sollen die übereinstimmenden Werte geprintet werden. Falls einer der letzten beiden Fälle eintritt soll es zu Zeile 68 springen.
 
Bei "yyyyyy" mag es so sein weil es nicht in der Liste ist.

Aber zb. bei Euro, ist in der Liste
In der for Schleife (ab zeile 54) wird es bei index 10 beim ersten if (Zeile 56) den Text ausgeben und die Variable whole auf true setzen.

Aber was passiert jetzt deine for schleife arbeitet weiter geht zum index 11 und da wird deine Variable wider auf false gesetz in der Zeile 64.

Dein while wird also nicht verlassen.

Du musst schon die for Schleife verlassen wenn du das erste oder zweite if true ist.


Du kommst nur aus Do While wenn du den letzen WährungsTyp in der Liste ist eingibst, also beim letzen Index dein wohle true wird.
 

Zurück
Oben