2011-09-26 7 views
1

Ok, j'ai finalement résolu ce problème, mais j'ai un problème restant, quand j'entre la chaîne en question, SI je mets des espaces dans le nombre que j'entre quand le programme tourne, il tourne ces espaces dans le numéro 9 dans ma sortie, si je n'utilise pas d'espaces tout fonctionne bien, des idées sur la façon dont je peux arrêter l'ajout de 9 dans mes espaces? Merci d'avance.Problème de sortie Java

package chapter_9; 

import java.util.Scanner; 


public class Nine_Seven { 


    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     System.out.print("Enter a string: "); 
     String string = input.nextLine(); 
     string = string.toUpperCase(); 

     for (int i = 0;i<string.length();i++){ 
      if(Character.isDigit(string.charAt(i))) 
       System.out.print(string.charAt(i)); 
      else 
       System.out.print(getNumber(string.charAt(i))); 
      } 
     } 


    public static int getNumber(char uppercaseLetter){ 

     if (uppercaseLetter == 'A' || uppercaseLetter == 'B' || uppercaseLetter == 'C') 
      return 2; 
     else if (uppercaseLetter == 'D' || uppercaseLetter == 'E' || uppercaseLetter == 'F') 
      return 3; 
     else if (uppercaseLetter == 'G' || uppercaseLetter == 'H' || uppercaseLetter == 'I') 
      return 4; 
     else if (uppercaseLetter == 'J' || uppercaseLetter == 'K' || uppercaseLetter == 'L') 
      return 5; 
     else if (uppercaseLetter == 'M' || uppercaseLetter == 'N' || uppercaseLetter == 'O') 
      return 6; 
     else if (uppercaseLetter == 'P' || uppercaseLetter == 'Q' || uppercaseLetter == 'R' || uppercaseLetter == 'S') 
      return 7; 
     else if (uppercaseLetter == 'T' || uppercaseLetter == 'U' || uppercaseLetter == 'V') 
      return 8; 
     else 
      return 9; 
    } 


} 

Exemple de sortie: Entrez une chaîne: 597 6630

597 * * 6630

+1

Votre logique indique que vous voulez traduire les majuscules dans les chiffres du téléphone.Cependant, vous ne limitez pas les caractères qui affichent les 9 autres que de dire qu'ils ne peuvent pas être A-V. Alors demandez-vous, que se passe-t-il si j'envoie un tiret dans votre programme? Suivez-le à travers cette séquence d'instructions if-then-else-if. Lisez aussi l'instruction Java 'switch'. – Marvo

Répondre

4

Regardez bien ce que getNumber() ne - si elle ne correspond à aucun des cas, vous « ai indiqué, il retourne 9.

options:

  • Modifier pour renvoyer un nombre différent explicitement pour l'espace
  • Modifier le code appelant pour ne pas appelgetNumber() si la valeur est ''.

Je recommanderais également de refactoriser le code appelant pour appeler seulement charAt(i) une fois, juste pour des raisons de propreté. Par exemple, vous voudrez peut-être:

for (int i = 0; i < string.length(); i++){ 
    char c = string.charAt(i); 

    if (Character.isDigit(c) || c == ' ') { 
     System.out.print(c); 
    } else { 
     System.out.print(getNumber(c)); 
    } 
} 

Comme il est indiqué dans les commentaires, getNumber() peuvent aussi être écrites avec un simple switch/case:

public static int getNumber(char uppercaseLetter) { 
    switch (upperCaseLetter) { 
     case 'A': case 'B': case 'C': 
      return 2; 
     case 'D': case 'E': case 'F': 
      return 3; 
     case 'G': case 'H': case 'I': 
      return 4; 
     case 'J': case 'K': case 'L': 
      return 5; 
     case 'M': case 'N': case 'O': 
      return 6; 
     case 'P': case 'Q': case 'R': case 'S' 
      return 7; 
     case 'T': case 'U': case 'V': 
      return 8; 
     default: 
      return 9; 
    } 
} 

(vous pourriez aussi bien empiler les cas verticalement si vous voulez , ainsi ...)

+0

et les instructions if peuvent être refactorisées dans les instructions switch/case (comme ceci - http://www.xefer.com/2006/12/switchonstring ou ici: http://stackoverflow.com/questions/338206/switch-statement -with-strings-in-java) –

+0

@ 0A0D: Vrai. Va éditer pour ça aussi ... –

1

Ajouter une instruction if entre else et return 9; qui émet seulement 9 W, X, Y, Z et append else return "";

0

Un peu hors-sujet mais toujours important: les grosses déclarations de switch comme celle-ci suggèrent souvent qu'il vous manque une sorte d'abstraction d'objet. J'adore énumérations pour des situations comme celle-ci, donc j'intégrerait cette logique dans un ENUM, peut-être comme ceci:

public enum PhoneDigit { 
    Zero(""), One(""), Two("ABC"), Three("DEF"), Four("GHI"), 
    Five("JKL"), Six("MNO"), Seven("PQRS"), Eight("TUV"), Nine(""); 

    private final String letters; 

    private PhoneDigit(String letters) { 
     this.letters = letters; 
    } 

    public boolean hasLetter(char character) { 
     return letters.contains(String.valueOf(character)); 
    } 

    public PhoneDigit valueOf(char character) { 
     for (PhoneDigit digit : values()) { 
      if (digit.hasLetter(character)) { 
       return digit; 
      } 
     } 

     return null; 
    } 
} 

Ce code est très facile à tester, il est réutilisable dans d'autres parties de votre système, etc. Bien que mon La méthode "valueOf" n'est pas aussi efficace qu'une instruction switch, vous pouvez facilement l'améliorer plus tard si cela s'avère important, ce qui est hautement improbable. Maintenant vous pouvez ajouter/tester d'autres méthodes comme getPhoneNumberFromString(String), boolean isPhoneDigit(char) etc pour cet objet, et non seulement les méthodes sont très pratiques à tester, mais il est logique de stocker toutes ces méthodes à cet endroit. Votre code sera plus facile à lire, le soleil brillera mieux, ce sera la meilleure chose que vous ayez jamais faite en achetant un SlapChop.

Enfin, notez que vous prenez des méthodes utiles comme values(), ordinal() etc gratuitement.

Bonne chance!