2017-03-06 4 views
3

Also musste ich ein Programm schreiben, das eine Telefontastatur nachahmt, während es eine Zeichenkette in ganze Zahlen umwandeln würde: abc (2), def (3), ghi (4), jkl (5), mno (6), pqrs (7), tuv (8), wxyz (9). Nur die Ausgabe muss Bindestriche (-) zwischen den Ziffern haben.Bindestrich zwischen jeder Ganzzahl in der Ausgabe

Beispiel Eingabe: Alabama

Ausgang: 2-5-2-2-2-6-2

Aber ich gerade erst Ausgang 2522262. Wie würde ich das richtig formatieren?

public class Keypad { 
public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 

    System.out.print("Enter a string: "); 
    String s = sc.nextLine(); 

    System.out.println(getNumbers(s)); 
} 

public static String getNumbers(String s) { 
    String result = new String(); 

    for (int i = 0; i < s.length(); i++) { 
     if (Character.isLetter(s.charAt(i))) { 
     result += getNumber(Character.toUpperCase(s.charAt(i))); 
     } 
     else { 
      result += s.charAt(i); 
     } 
    } 
    return result; 
} 

public static int getNumber(char upperCaseLetter) { 
    int number = ((upperCaseLetter - 'A')/3) + 2; 
    if (number < 7) { 
     return number; 
    } 
    else if (upperCaseLetter - 'A' < 20) { 
     return 7; 
    } 
    else if (upperCaseLetter - 'A' < 23) { 
     return 8; 
    } 
    else { 
     return 9; 
    } 
    } 
} 
+1

Wenn Sie Java 8 verwenden, haben diese Frage bereits eine Antwort [String.join] (http://stackoverflow.com/questions/1978933/a-quick-and-easy-way-to-join-array-elements -mit-einem-Trennzeichen-das-Gegenteil-von-sp) –

+0

@ ÉricRoberge das ist ein gutes, kann es in einer Zeile tun, ohne das letzte Zeichen usw. entfernen zu müssen –

Antwort

2

Zum Ort Sie das Ergebnis konstruieren und den Bindestrich hinzufügen:

result += getNumber(Character.toUpperCase(s.charAt(i))); 
    result += "-"; 

Dann, bevor Sie nach Ihrer Rückkehr den letzten Bindestrich abstreifen müssen:

return result.substring(0, result.length() - 1); 

So ist die Die ganze Methode würde wie folgt aussehen:

public static String getNumbers(String s) { 
    String result = new String(); 

    for (int i = 0; i < s.length(); i++) { 
     if (Character.isLetter(s.charAt(i))) { 
      result += getNumber(Character.toUpperCase(s.charAt(i))); 
      result += "-"; 
     } 
     else { 
      result += s.charAt(i); 
     } 
    } 
    return result.substring(0, result.length() - 1); 
} 
1

Ändern Sie den Code in getNumbers (String) zu

for (int i = 0; i < s.length(); i++) { 
    if (Character.isLetter(s.charAt(i))) { 
    result += getNumber(Character.toUpperCase(s.charAt(i))); 
    if (i < (s.length-1) 
     result += '-"; 
    } 
} 
return result; 

}

+0

@Dakota, das Sie es in der wieder tun müssten andere Aussage. –

+0

Entschuldigung, ich konzentrierte mich auf den Bindestrich. Ich werde die else-Anweisung herausnehmen. – Dakoda

1

Es gibt eine Methode in Java 8, die genau dies tut. Verwenden Sie String.join, docs, um nach jedem Zeichen einen Strich einzufügen.

public static String getNumbers(String s) { 
     String result = new String(); 

     for (int i = 0; i < s.length(); i++) { 
      if (Character.isLetter(s.charAt(i))) { 
      result += getNumber(Character.toUpperCase(s.charAt(i))); 
      } 
      else { 
       result += s.charAt(i); 
      } 
     } 

     return String.join("-", result.split(""); 
    } 

Hinweis

Sie sollten versuchen, mit der += mit Strings zu vermeiden, bietet StringBuffer eine bessere Leistung. Wenn Sie Zeichenfolgen verketten, erstellen Sie tatsächlich neue Objekte für jede neue Zeichenfolge, die Sie verketten. Stellen Sie sich eine große Schleife vor, in der Sie n Objekte erstellen, um die neue Zeichenfolge zu erstellen.

1

StringJoiner wurde zu diesem Zweck zu Java 8 hinzugefügt. Sehr einfach und unkompliziert zu bedienen:

StringJoiner sj = new StringJoiner("-", "", ""); 
sj.add("1").add("1").add("2"); 
String desiredString = sj.toString(); 

oder mit Stream-API, die ein wenig bequemer in Ihrem Fall sein könnten:

List<Integer> integers = Arrays.asList(1,2,3,4,5); 
String hyphenSeparatedNumbers = integers.stream() 
    .map(Object::toString) 
    .collect(Collectors.joining("-")); 

Auch String.join eine hervorragende Alternative für diese Aufgabe ist.

Verwandte Themen