2017-11-28 2 views
1

각 char을 어떤 값으로 오프셋하여 char 배열을 조작하려고합니다.for-each 배열 조작

내 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

그래서 각 루프에 대해 이렇게하는 방법은 없습니까? – dchlebicki

+1

아니요.이 경우 반복되는 배열의 값을 설정하는 방법이 없습니다. – Henrik

+1

@dchlebicki 글쎄, 사실, 거기에 대한 외부 색인 변수와 함께 각각을 사용하는 Lalit에 의해 답변이지만, 그것은 본질적으로 내 대답과 동일합니다. – Henrik

0

s.toCharArray()을 호출하면 String이 char [] 배열로 변환됩니다. 유형 char원시 유형 Java 형식이므로 루프의 변수 c에 값의 복사본이 있습니다. c 변수를 변경하면 원래 배열을 수정하지 않습니다.

String을 수정해야하는 경우 결과가있는 다른 String을 작성해야하며 원래 String을 수정할 수 없습니다.

+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

두 번째 배열을 만들 필요가 없습니다. –

+0

@KlitosKyriacou는이 작업을 수행하는 방법 중 하나입니다. –

+2

이것은 정말 어색합니다. 기본 for 루프 만 사용하면 더 명확 해집니다. –

1

을 이렇게하면 값을 다시 설정할 수 있습니다

01 : 또는

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

} 

, 재 할당을 피할 수 약간 더 효율적인 방법 : 다음 for 루프를 사용하지 않고 그것을 할 방법

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

}