2014-02-13 3 views
2

저는 최근에 자바를 사용하기 시작했고 문장이나 짧은 문장으로 문장을 검사하는 짧은 프로그램을 만들고자합니다. 역순으로 StringBuilder를 사용하고 싶습니다. 내 생각은 사용자 항목에서 공백과 쉼표가 제거 된 상태로 변환 된 소문자로 변환 된 하나의 변수와 그 반대의 항목을 보유 할 다른 변수를 갖고, .equals를 사용하여 비교합니다. 그러나 .reverse() 메서드는 내 사용자 항목의 값을 변경하고 있으며 그 이유를 파악할 수 없습니다. Java의 레퍼런스에 대해서는 알고 있지만 최근에는 완전히 이해하지 못했습니다.StringBuilder가 초기 변수를 역으로 변경합니까?

도움을 주시면 감사하겠습니다.

Enter a word or phrase to test for a palindrome: 
Dog 
sbEntry: dog 
sbEntryReverse: god 
sbEntry: god 
+1

당신이 [javadoc에을 (읽고 http://docs.oracle .com/javase/7/docs/api/java/lang/StringBuilder.html # reverse % 28 % 29) 해당 메소드에 대해? – assylias

+2

StringBuilder는 변경할 수 있으며 작업을 수행 할 때 변경할 수 있습니다. –

+0

javadoc을 한 번 보았지만 여전히 작동하지 못했습니다. GregTheRules가 응답에서 나에게 대답을했습니다. – Stinkidog

답변

1

당신은 sbEntrysbEntryReverse을 비교할 수 없습니다. 변경할 수없는 String 개체에서 작동하는 메서드와 달리 reverse()과 같은 StringBuffer 메서드는 StringBuffer 개체의 문자 버퍼를 변경합니다. 개체가 String 인 동안 StringBuffer 개체는 변경 가능합니다.

는 대신, entryFinal, 원래의 입력 문자열로 StringBuffer (sbEntry 또는 sbEntryReverse)의 최종 내용을 비교해야합니다

String entryLower = entry.toLowerCase(); 
String entryNoSpace = entryLower.replace(" ", ""); 
String entryFinal = entryNoSpace.replace(",", ""); 

//Convert String to StringBuilder to use reverse method 
StringBuilder sbEntry = new StringBuilder(entryFinal); 
StringBuilder sbEntryReverse = sbEntry.reverse(); 
boolean isPalindrome = entryFinal.equals(sbEntryReverse.toString()); 
+0

자세한 설명을 가져 주셔서 감사합니다. 그것은 완벽하게 분명한 의미를가집니다. StringBuffer 객체는 문자열이 변경되지 않는 한 변경할 수 있다는 정보를받지 못했습니다. – Stinkidog

+0

이 변경 가능성 문제를 완전히 피하려면'StringUtils.reverse (String)'또는'StringBuffer.reverse()'대신에 비슷한 메서드를 사용하는 것을 고려하십시오. http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#reverse(java.lang.String)를 참조하십시오. –

+0

@DerekMahar 따라서 내부적으로'StringBuilder'는'String' (또는 모든'String's)의 사본을 유지 보수하고'reverse'가 호출되어 내부 복사본이 수정 될 때? –

-1

자바 문서는 말한다

reverse() 
Causes this character sequence to be replaced by the reverse of the sequence. 

이 때문에 원래 문자열을 대체합니다 : 단어 "개"를
import java.util.*; 

public class Palindrome { 

public static void main(String[] args) { 

    Scanner kb = new Scanner(System.in); 
    System.out.println("Enter a word or phrase to test for a palindrome: "); 
    String entry = kb.nextLine(); 

    String entryLower = entry.toLowerCase(); 
    String entryNoSpace = entryLower.replace(" ", ""); 
    String entryFinal = entryNoSpace.replace(",", ""); 

    //Convert String to StringBuilder to use reverse method 
    StringBuilder sbEntry = new StringBuilder(entryFinal); 
    System.out.println("sbEntry: " + sbEntry); 

    StringBuilder sbEntryReverse = sbEntry.reverse(); 
    System.out.println("sbEntryReverse: " + sbEntryReverse); 


    System.out.println("sbEntry: " + sbEntry); 

이 출력을 제공합니다. StringBuilder 변이 (변경) 내용에 reverse()를 호출

+0

'reverse()'는 원래 입력 문자열을 대체하지 않습니다. 이것은 내부의 문자 버퍼의 내용을'StringBuffer'로 대체합니다. –

0

: 당신은 모두 StringBuilder에 sbEntry에 대한 참조의 복사본을 건네 때문입니다

StringBuilder sb = new StringBuilder("hello"); 
System.out.println(sb); // hello 

sb.reverse(); 
System.out.println(sb); // olleh 

sb.reverse(); 
System.out.println(sb); // hello 
0

. 대신이의

:

StringBuilder sbEntryReverse = sbEntry.reverse(); 

이 시도 : sbEntry.reverse()sbEntry 참조 처 StringBuffer의 내용을 변경하기 때문에

StringBuilder sbEntryReverse = new StringBuilder(sbEntry.toString()).reverse(); 
+0

고마워요! 이것은 내가 원했던대로 효과가 있었다. .toString()을 추가해도 원래 변수에 영향을주지 않는 이유는 무엇입니까? – Stinkidog

+0

toString()은 원래 변수를 참조하지 않고 "valueOf"sbEntry를 반환하기 때문입니다. – GregTheRules

+0

알았어요. 참조에 대한 나의 이해는 거친다. 그러나 이것은 도움이되었다. – Stinkidog

관련 문제