2016-03-23 9 views
1

"abcd"のような文字列を取り、出力が "aabbccdd"になるように各文字を2回出力するメソッドを記述しようとしています。これまでのところ、これは私が持っているコードです:変数が文字列のときにプログラム番号が印刷されるのはなぜですか?

String abcd = "abcd"; 
    String t = ""; 

    for (int i = 0; i < abcd.length(); i++){ 
     t = t + (abcd.charAt(i) + abcd.charAt(i)); 
    } 
    for (int j = 0; j < abcd.length(); j++){ 
     System.out.printf("%s\n",t); 
    } 

上記のコードは数字を印刷していますが、私はその理由を理解していません。すべての変数が文字列なので、文字を出力してはいけませんか?

+0

私はあなたが別のチャーにチャーを追加することと関係があると思います。 –

答えて

4

変数は文字列ですが、charAtは数字の種類のcharを返します。これらの数値を加算すると、intが残ります。代わりにStringBuilderを使用し、charAtの結果を2回追加します。

+0

ありがとうございます。私はあなたが示唆したようにそれをやり終えた。私はstringbuilderを見落としていました。 – Vanessa

0

はちょうどこのような括弧を削除:

t = t + abcd.charAt(i) + abcd.charAt(i);

は、そうでない場合char値を数値charAt(i)を使用して取得するとき、そのASCII値に応じて添加されます。

+0

ありがとうございます。それを見ると、明らかな修正のように見えます。私はそれを見ていないとは信じられない。 – Vanessa

1

Binary Numeric PromotionJava Language Specificationから参照してください。

オペレータが数値型に変換可能な値を表す必要がありそれぞれがオペランドの対、バイナリ数値昇格を適用する場合、以下の規則が適用さ

、順番に:

  1. 場合任意のオペランドは参照型であり、アンボックス変換が行われます。プリミティブ変換を広げる

  2. は、以下の規則によって指定される一方または両方のオペランドを変換するために適用される:

    • 一方のオペランドがタイプdoubleの場合、他の二重に変換されます。

    • どちらのオペランドもfloat型の場合、もう一方はfloat型に変換されます。

    • どちらのオペランドもlong型の場合、他方はlongに変換されます。

    • そうでないと、両方のオペランドがint型に変換されます。括弧を削除し、あなたの特定のユースケースでは

class Test { 
    public static void main(String[] args) { 
     int i = 0; 
     float f = 1.0f; 
     double d = 2.0; 
     // First int*float is promoted to float*float, then 
     // float==double is promoted to double==double: 
     if (i * f == d) System.out.println("oops"); 

     // A char&byte is promoted to int&int: 
     byte b = 0x1f; 
     char c = 'G'; 
     int control = c & b; 
     System.out.println(Integer.toHexString(control)); 

     // Here int:float is promoted to float:float: 
     f = (b == 0) ? i : 4.0f; 
     System.out.println(1.0/f); 
    } 
} 

十分なはずです。それらを使用することで、最初にチャートの追加が強制されます。

+0

ありがとうございました。 – Vanessa

0

あなたはその文字列値を取得できるように、

t += abcd.charAt(i) + (abcd.charAt(i) + ""); 

にその行を変更することができます。

0

パブリッククラスTest {

public static void main(String[] args) { 
    String s = "abcd"; 
    String t =""; 

    for (int i = 0; i < s.length(); i++){ 
     t = t + s.charAt(i) + s.charAt(i); 
    } 
    for (int j = 0; j < s.length(); j++){ 
     System.out.printf("%s\n",t); 
    } 
} 

}

+0

このデモと同じように、String値を取得できます –

0

ストレートコードには、[OK]:

String txt = "abcd"; 
StringBuilder sb = new StringBuilder(); 

char c; 
for (int i = 0; i < txt.length(); i++){ 
    c = txt.charAt(i); 
    sb.append(c).append(c); 
} 
System.out.printf("%s\n", sb.toString()); 
  • StringBuilder - あなたは特に、文字列や文字を連結しようとしています長い文字列を連結するには、StringBuilderを使用します。追加するたびに、文字列のコピーを作成しません。
  • 文字の追加 - Bax's answerは既にこれを指摘しています。 Primitive data types in Java

チャー:CHARデータ型は、1つの16ビットUnicode文字です。 '\ u0000'(または0)の最小値と '\ uffff'(または 65535を含む)の最大値を持つ です。

あなたが追加の結果として受け取ったものを説明します。

0
String charDouble(String str){ 

    StringBuilder sb = new StringBuilder(); 
    for(int i=0; i< str.length(); i++){ 
    sb.append(str.chatAt(i)); 
    sb.append(str.charAt(i)); 
    } 
    return sb.toString(); 

    //Alternatively you could just print it here. 
    //System.out.println(sb.toString()); 

} 
関連する問題