2017-03-06 41 views
3

因此我必須編寫一個模擬電話鍵盤的程序,而它會將一串文本轉換爲整數:abc(2),def(3),ghi(4),jkl( 5),mno(6), pqrs(7),tuv(8),wxyz(9)。除輸出之間必須有數字之間的連字符( - )。連字符之間的每個整數

示例輸入:Alabama

輸出:2-5-2-2-2-6-2

但我就是隻輸出2522262。我將如何正確地格式化?

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

如果你使用Java 8,這個問題已經有了答案[String.join](http://stackoverflow.com/questions/1978933/a-quick-and-easy-way-to-join-array-elements -with-a-separator-the-opposite-of-sp) – 2017-03-06 20:32:23

+0

@ÉricRoberge這是一個很好的,可以在一行中完成而不必刪除最後一個字符等。 –

回答

2

轉到您構建的結果,並添加連字符的地方:

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

然後你回來之前,你必須剝去最後連字符:

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

所以整個方法將如下所示:

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

變化getNumbers(字符串)的代碼

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你必須再次在else語句。 –

+0

對不起,我專注於連字符。我會拿出else語句。 – Dakoda

1

有在Java中8的方法,不只是這個。使用String.join,docs,在每個字符後添加一個破折號。

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(""); 
    } 

注意

你應該儘量避免使用+=用繩子,StringBuffer提供更好的性能。當你連接字符串時,你實際上是爲每個你連接的新字符串創建新的對象。設想一個大循環,你將有n對象來創建新的字符串。

1

StringJoiner已被添加到Java 8用於此目的。非常簡單明瞭的使用:

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

或流API,這可能是你的情況更方便一點:

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

而且String.join是這個任務的一個極好的選擇。

相關問題