2017-04-01 1 views
0

Ich weiß, dass keine goto in Java gibt es, aber ich bitte zu allgemeinen, wenn es eine Methode, um goto aus, wenn zu anderem Beispiel ist:‚goto‘ Verwendung von zu bewegen, wenn zu anderen

public void decToAsci(String decimal) { 
    String nb = ""; 
    int number; 
    for (int i = 0; i < decimal.length(); i++) { 
     Character c = decimal.charAt(i); 
     if (!c.equals(' ')) { 
      nb += decimal.charAt(i); 
      if (i == decimal.length() - 1) 
       //here i want to jump to else 
       // i can do it like this : 
       // System.out.print((char) Integer.parseInt(nb) + " "); 
       // but i repeat code in else here ..i just want to jump to else 
     } else { 
      number = Integer.parseInt(nb); 
      System.out.print((char) number + " "); 
      nb = ""; 
      number = 0; 
     } 
    } 
} 

Ich versuche, dies:

if (!c.equals(' ')) { 
    nb += decimal.charAt(i); 
    if (i == decimal.length() - 1) continue label; 
} else { 
    label: the code in else 
} 

Aber nicht gearbeitet, nicht mit Break Label auch gearbeitet. Ich verstehe das weiter, Pause. Werden zwischen Sohn und Eltern so verwendet? :

label: 
for(int i=0 ; i<n ; i++) 
    if (cond) break label; 

ich über ein Verfahren stellen, die von, wenn auf andere (2 Söhne)

(kein Sohn und ein Elternteil, sondern springt zwischen zwei Söhne)

Ich denke sogar springen können mit goto auf c und C++ 4 Beispiel wir können es nicht tun

+3

Verwenden Sie eine Methode. Rufen Sie dieselbe Methode von Ihrem if-Block und Ihrem else-Block auf. So vermeiden Sie Code-Duplizierung. Sie schreiben eine Methode mit diesem Code und rufen sie von mehreren Stellen aus auf. –

+0

ist dies die einzige Lösung? –

+0

Ändere 'if (i == decimal.length() - 1) setze label fort;' zu 'if (i! = Decimal.length() - 1) {/ * mach was du brauchst * /};' – c0der

Antwort

1

Alles, was nutzt „goto wie“ Verhalten ist eine schlechte Idee. Es ist allgemein anerkannt, dass gotoartige Kontrollstrukturen zu Code führen, der schwieriger zu lesen/zu warten ist, als wenn man sich an Kontrollstrukturen mit "strukturierter Programmierung" hält.

Hier sind (IMO) zwei "richtige Ansätze" zur Lösung des Problems:

Ansatz # 1 - neu ordnen die Logik

public void decToAsci(String decimal) { 
    String nb = ""; 
    for (int i = 0; i < decimal.length(); i++) { 
     Character c = decimal.charAt(i); 
     if (!c.equals(' ')) { 
      nb += decimal.charAt(i); 
     } 
     if (c.equals(' ') || i == decimal.length() - 1) { 
      int number = Integer.parseInt(nb); 
      System.out.print((char) number + " "); 
      nb = ""; 
     } 
    } 
} 

(Wenn die c.equals(' ') teuer war eine temporäre Variable verwenden könnte vermeiden Sie es neu zu berechnen.In diesem Fall ist es billig und wird wahrscheinlich vom JIT-Compiler inline und weiter optimiert werden.

)

Ansatz # 2 - Refactoring-Code in eine methid

public void decToAsci(String decimal) { 
    String nb = ""; 
    for (int i = 0; i < decimal.length(); i++) { 
     Character c = decimal.charAt(i); 
     if (!c.equals(' ')) { 
      nb += decimal.charAt(i); 
      if (i == decimal.length() - 1) 
       nb = processAsInt(nb); 
     } else { 
      nb = processAsInt(nb); 
     } 
    } 
} 

public String processInt(String nb) { 
    int number = Integer.parseInt(nb); 
    System.out.print((char) number + " "); 
    return ""; 
} 

In diesem Zusammenhang ist der erste Ansatz gibt einen besseren Code. (IMO)

+0

beste Antwort :) danke Mann –

0

Java hat nicht goto. Aber, wenn ich verstehe Sie, Sie switch verwenden könnte, ist das Standardverhalten Durchfall so etwas wie

int number; 
for(int i=0 ; i<decimal.length() ; i++) 
{ 
    Character c = decimal.charAt(i); 
    switch (c) { 
    default: // <-- c is not ' ' 
     nb += decimal.charAt(i); 
     if (i != decimal.length() - 1) { 
      break; 
     } 
     // i == decimal.length() - 1, fall-through 
    case ' ': // <-- c is ' ', or it fell through 
     number = Integer.parseInt(nb); 
     System.out.print((char) number + " "); 
     nb = ""; 
     number = 0; 
    } 
} 
+0

Ich liebe deine Lösung .. sehr interessant –

+7

Ich hasse es! Ich würde es noch mehr hassen, wenn ich es aufrechterhalten müsste. –

+0

es ist eine Lösung mindestens .. aber wir brauchen eine echte Lösung, um von 'wenn' zu 'sonst' zu springen –

0

Ich glaube, Sie nicht, dies durch richtig denken war. Eine if-else-Anweisung ist so konzipiert, dass Sie nicht vom Zweig if zum Zweig else springen können. Der ganze Sinn einer if-Aussage besteht darin, klarzustellen, dass "wenn das wahr ist, tun Sie das, sonst tun Sie das". Der Versuch, dies mit schmutzigen Tricks zu tun, führt nur zu Wartungsproblemen. Ihr Code wird sehr schwer zu verstehen sein.

Statt darüber nachzudenken, wie das zu brechen, wenn Erklärung, warum nicht eine Abhilfe finden? Was Sie hier zu tun scheinen, ist nur das Lesen von Ganzzahlen, die durch Leerzeichen voneinander getrennt sind. Wenn das ist, was Sie tun, warum nicht ein ' ' Zeichen an das Ende der Zeichenfolge vor der Schleife anhängen? Dies wird das gleiche wie die Bedingung i == decimal.length() - 1

decimal += " "; 
String nb = ""; 
int number; 
for (int i = 0; i < decimal.length(); i++) { 
    ... 

erreichen Sie können auch ein Scanner verwenden:

Scanner s = new Scanner(decimal); 
while (s.hasNextInt()) 
    System.out.print(((char)s.nextInt()) + " "); 
+0

Hallo Mann, Ihre Frage zu beantworten: [Warum nicht ein '' Zeichen an das Ende der Zeichenfolge vor der Schleife anhängen?] ==> Zuerst tat ich das, nachdem ich entscheide, es zu umgehen als ich viel vergesse und ich werde es 4 Freunden schicken .. gute Lösung mit Scanner auch. danke :) –

Verwandte Themen