2017-11-28 5 views
1

私は、各charをある値でオフセットすることによってchar配列を操作しようとしています。for-each array manipulation

私のIDEのデバッグ機能を使用すると、すべてがループ内で正常に動作することがわかりました。ループの中では、配列が変更されていないように思えますが、変更はfor-eachループのスコープ内でのみ有効なので、これは(少なくとも私は信じています)。

どのようにこれらの変更を清潔でプロフェッショナルな方法で永久に行うことができますか?

マイコード:

public class OffsetTest { 
    public static void main(String[] args) { 
     String someString = "Cuckoo"; 
     String output = stringOffset(someString); 
     System.out.println(output); 
    } 

    public static String stringOffset(String s) { 
     char[] ca = s.toCharArray(); 
     for(char c : ca) { 
      c += 3; 
     } 
     return String.valueOf(ca); 
    } 
} 

はどのようにこれを行うには?

+4

'c 'は参照ではない –

答えて

5

あなたは、このように変更しない配列を残し、別の変数に値をコピーし、そのインクリメントしています。

代わりにインデックス変数を使用して配列を反復処理します。あなたの関数内でループ内の文字列の文字のコピーで作業している

for (int i = 0 ; i < ca.length ; i++) { 
    ca[i] += 3; 
} 
+1

これは、各ループごとにaで行う方法はありませんか? – dchlebicki

+1

いいえ、あなたはその場合に反復処理している配列の値を設定する方法がありません。 – Henrik

+1

@dchlebickiまあ、実際には、Lalitの回答がありますが、それは外部のインデックス変数にfor-eachを使用していますが、それは私の答えと本質的に同じです。 – Henrik

0

s.toCharArray()を呼び出すと、文字列はchar []配列に変換されます。タイプcharはJavaのプリミティブタイプであるため、ループ内の変数cには値のコピーがあります。変数cを変更した場合、元の配列は変更されません。

あなたは文字列を変更する必要がある場合、あなたは元の文字列を変更することはできません、その結果を別の文字列を構築する必要があります。

+4

要素が参照型であっても、' r = doSomethingWith(r); 'は配列の値を置き換えません。 –

1

を、あなたが本当にこれを必要とする場合、あなたはこのような何かを行うことができます:これは、あなたは再び値を設定することができます

public class classname{ 
    public static void main(String[] args) { 
     String someString = "Cuckoo"; 
     String output = stringOffset(someString); 
     System.out.println(output); 
    } 

    public static String stringOffset(String s) { 
     char[] ca = s.toCharArray(); 
     char cb[] = new char[s.length()];//array to store new characters after offsetting 
     int i=0; 
     for(char c : ca) { 
      c += 3; 
      cb[i]=c; 
      i++; 
     } 
     return String.valueOf(cb); 
    } 
} 
+1

2番目の配列を作成する必要はありません。 –

+0

@KlitosKyriacouはこれを行う方法の一つです。 –

+2

これは本当に厄介です。基本的なforループを使用するだけで、より明確になります。 –

1

ここではforループを使用せずにそれを行う方法は次のとおりです。

また
public static String stringOffset(String s) { 
    return s.codePoints() 
      .map(c -> c + 3) 
      .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) 
      .toString(); 

} 

、再配分を回避し、わずかに、より効率的な方法:

public static String stringOffset(String s) { 
    return s.chars() 
      .collect(() -> new StringBuilder(s.length()), 
        (sb, c) -> sb.append((char) (c + 3)), 
        StringBuilder::append) 
      .toString(); 

}