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.

httpdigest

Top Contributor
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?
 

mihe7

Top Contributor
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
Y

yfons123

Gast
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:D)
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
 

KonradN

Super-Moderator
Mitarbeiter
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.
 
Y

yfons123

Gast
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:D
 

hansimunglueck

Neues Mitglied
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.
 

Jw456

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W While Schleife funktioniert nicht ganz Allgemeine Java-Themen 4
W While-ESC-Schleife funktioniert nicht Allgemeine Java-Themen 3
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
D While-Schleife - if Zweig unterbrechen Allgemeine Java-Themen 1
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
M While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt Allgemeine Java-Themen 3
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
N Frage zur while-Schleife Allgemeine Java-Themen 18
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
S for-Schleife, while-Schleife Problem Allgemeine Java-Themen 6
R while schleife auf 3 durchgänge beschränken Allgemeine Java-Themen 6
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
S Do-While Schleife bricht nicht ab Allgemeine Java-Themen 3
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
J Thread pausieren, lange while-Schleife Allgemeine Java-Themen 8
H Threads.... ich will aus der While-Schleife raus Allgemeine Java-Themen 6
J Schachbrett mit for- oder while-Schleife Allgemeine Java-Themen 22
V Problem in While-Schleife Allgemeine Java-Themen 3
T getParameter in while schleife Allgemeine Java-Themen 3
O while - Schleife unterbrechen mit break; Allgemeine Java-Themen 5
M Problem mit while/do Schleife Allgemeine Java-Themen 12
B Try/Catch in While-Schleife mit Scanner - Hilfe! Allgemeine Java-Themen 3
F While(true)-Schleife im JPanel Allgemeine Java-Themen 9
N vergleich mit while und for schleife Allgemeine Java-Themen 7
M Keine weitere Eingabe in der Main möglich. Eventueller Ansatz über while. Allgemeine Java-Themen 8
C Schachbrett mit while-schleifen Allgemeine Java-Themen 7
A Swing Taschenrechner while Schlaufe Allgemeine Java-Themen 12
I NullPointer während while(){} Allgemeine Java-Themen 4
D ProcessBuilder und die while() Allgemeine Java-Themen 3
J Konsolen Anwendung mit while(true) Allgemeine Java-Themen 6
N while Schlauf und ActionEvent Allgemeine Java-Themen 2
L Exception auslösen, um while Schlaufe zu verlassen(rxtx.org) Allgemeine Java-Themen 6
B while mit BufferedReader beenden Allgemeine Java-Themen 5
T Verschachtelte For-Schleife gibt falschen Wert zurück, Abbruchbedingung evtl. falsch? Allgemeine Java-Themen 9
A verschachtelte for-Schleife in einen Stream umwandeln? Allgemeine Java-Themen 4
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
N Warum wird die For Schleife nicht betreten Allgemeine Java-Themen 4
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
A For-Schleife Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
1 Klassen Variabel aus Schleife übergeben Allgemeine Java-Themen 8
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
K For-Schleife <> oder != Operator verwenden? Allgemeine Java-Themen 2
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
F Zweifache For-Schleife Allgemeine Java-Themen 6
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
T for - Schleife Allgemeine Java-Themen 1
R Komplizierte Schleife Allgemeine Java-Themen 1
Q For-Schleife in String-Value Allgemeine Java-Themen 3
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
P Erweiterte For Schleife Allgemeine Java-Themen 7
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
Y automatisierte for Schleife Allgemeine Java-Themen 13
B For schleife und weiter? Allgemeine Java-Themen 8
D Probleme bei for-Schleife Allgemeine Java-Themen 4
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
F for-Schleife mit : Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
F Foreach und for - Schleife Allgemeine Java-Themen 10
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
x22 for-Schleife Allgemeine Java-Themen 76
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
J Schleife mit : Allgemeine Java-Themen 18
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
K CheckBox schleife Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
R In einer for Schleife bei einem Substring anfangen, wo man davor aufgehört hat Allgemeine Java-Themen 6
D Sterne Muster mit einer Schleife Allgemeine Java-Themen 5
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
hdi Detail-Frage zur for-Schleife Allgemeine Java-Themen 9
Q Variable aus Schleife/Switch benutzen Allgemeine Java-Themen 7
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
C Geschachtelte For-Schleife: Äußere Schleife wird nur einmal durchlaufen!? Allgemeine Java-Themen 3
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
I For- Schleife falsch? Allgemeine Java-Themen 8
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben