2016-11-28 5 views
0

Ich arbeite an einem Projekt, um eine 3-stellige Zeichenfolge übergeben und es sollte eine ArrayList aller möglichen Mnemonische Kombinationen zurückgeben. Zum Beispiel, wenn ich die Ziffern "623" übergebe, sollte es eine Liste von zurückgeben MAF MBF MCF NAF NBF NCF OAF OBF OCF ].Rekursive Liste Mnemonics

Aber ich bekomme immer ein Ergebnis von [MAD, MADE, MADEF, MABD, MABDE, MABDEF, MABCD, MABCDE, MABCDEF, MNAD, MNADE, MNADEF, MNABD, MNABDE, MNABDEF, MNABCD, MNABCDE, MNABCDEF, MNOAD , MNOADE, MNOADEF, MNOABD, MNOABDE, MNOABDEF, MNOABCD, MNOABCDE, MNOABCDEF]. Ich kann anscheinend nicht herausfinden, was ich hier falsch mache. Es soll Strings der Länge 3 zurückgeben und es scheint, als würde es die vorherigen Buchstaben anheften.

Hier ist mein Code:

public class PhoneMnemonics { 
    public static void main(String[] args) { 
     ArrayList<String> test = listMnemonics("623"); 
     System.out.print(test); 
    } 

    public static ArrayList<String> listMnemonics(String number) { 
     ArrayList<String> result = new ArrayList<String>(); 
     recursiveMnemonics(result, "", number); 
     return result; 
    } 

    private static void recursiveMnemonics(ArrayList<String> result, String mnemonicSoFar, String digitsLeft) { 
     if (digitsLeft.length() == 0) { 
     // Add current mnemonic 
     result.add(mnemonicSoFar); 
     } else { 
     // Try all combinations for single digit 
     int numLetters = digitLetters(digitsLeft.charAt(0)).length(); 
     String letters = digitLetters(digitsLeft.charAt(0)); 
     if (digitsLeft.length() > 1) { 
       digitsLeft = digitsLeft.substring(1); 
     } else { 
       digitsLeft = ""; 
     } 
     for (int i = 0; i < numLetters; i++) { 
      char c = letters.charAt(i); 
      mnemonicSoFar = mnemonicSoFar + Character.toString(c); 
      recursiveMnemonics(result, mnemonicSoFar, digitsLeft); 
     } 
     } 
    } 

    public static String digitLetters(char ch) { 
     String result = ""; 
     switch (ch) { 
     case '2': result = "ABC"; 
        break; 
     case '3': result = "DEF"; 
        break; 
     case '4': result = "GHI"; 
       break; 
     case '5': result = "JKL"; 
        break;   
     case '6': result = "MNO"; 
        break;   
     case '7': result = "PQRS"; 
        break; 
     case '8': result = "TUV"; 
        break;   
     case '9': result = "WXYZ"; 
        break;   
     } 
     return result; 
    } 
} 

Jede Hilfe ist sehr zu schätzen!

BEARBEITEN: Ich habe die if-Anweisung verschoben, die die digitsLeft-Zeichenfolge im Code höher bearbeitet und meine Ergebnisse ein wenig geändert hat.

+0

Versuchen Sie, eine IDE wie Eclipse herunterzuladen und in den Debug-Modus zu gelangen. –

+0

Ich benutze JGrasp und ich habe noch nie mit der Debug-Funktion experimentiert. Nach dem Versuch gerade jetzt, nichts erscheint. Das Programm selbst kompiliert und läuft gut, aber ich kann nicht den richtigen Weg zum rekursiven Aufruf meiner Methode herausfinden. – SkyDC

+0

Der Fehler ist in der For-Schleife. – ajb

Antwort

0

Das Hauptproblem ist, dass MnemonicSoFar behoben werden sollte, nachdem Sie es zu den Ergebnissen hinzufügen. Zum Beispiel:

Sie erreichen MAD und Sie fügen es zum Ergebnis hinzu. Danach musst du das Gleiche mit mnemonicSoFar = MA und dem zu fügenden Buchstaben E beachten. Beachten Sie, dass Sie den letzten Buchstaben von mnemonicSoFar herausnehmen. So sollten Sie Ihren Code dies korrigieren:

for (int i = 0; i < numLetters; i++) { 
       char c = letters.charAt(i); 
       mnemonicSoFar = mnemonicSoFar + Character.toString(c); 
       recursiveMnemonics2(result, mnemonicSoFar, digitsLeft); 
       mnemonicSoFar = mnemonicSoFar.substring(0,mnemonicSoFar.length()-1); 
} 

Wenn Sie kümmern Ihre Programmierstil zu verbessern, ich Refactoring Code ein bisschen.

private static void recursiveMnemonics(ArrayList<String> result, String mnemonicSoFar, String digitsLeft) { 
    if(digitsLeft.length() == 0) { 
     result.add(mnemonicSoFar); 
     return; 
    } 
    String letters = digitLetters(digitsLeft.charAt(0)); 
    digitsLeft = digitsLeft.substring(1); 
    for(int i = 0; i < letters.length(); i++) { 
     mnemonicSoFar = mnemonicSoFar + letters.charAt(i); 
     recursiveMnemonics(result, mnemonicSoFar, digitsLeft); 
     mnemonicSoFar = mnemonicSoFar.substring(0,mnemonicSoFar.length()-1); 
    } 
} 

Meiner Meinung nach ist es viel besser lesbar.

+0

Vielen Dank! Ich weiß, dass mein Code ein wenig außer Kontrolle geraten ist. Ich habe versucht, mein Bestes zu geben, und habe immer wieder vergessen, die zusätzlichen Dinge, die ich hinzugefügt habe, zu entfernen. Ich werde Ihren Rat befolgen und die Angewohnheit üben, meinen Code lesbarer zu machen. – SkyDC