2017-03-06 3 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。これを正しくフォーマットするにはどうすればいいですか?だから、

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

:あなたが最後にハイフンを取り除きする必要があります戻る前に、次に

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

:あなたは結果を構築し、ハイフンを追加する場所に

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-sp-of-sp) –

+0

@ÉricRobergeこれは良いです。最後の文字などを削除することなく1行で処理できます。 –

答えて

2

ゴー全体の方法は次のようになります。

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

変更

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

にgetNumbers(文字列)内のコードだけこれを実行するJava 8における方法があります。 String.joindocsを使用して、各文字の後にダッシュを追加します。

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は、このタスクのためのすばらしい代わりです。

関連する問題