2013-01-07 6 views
0

String을 가져 와서 구분 기호에 따라 두 개의 문자열로 분할해야하는 void 메서드가 있습니다. 디버거를 사용하면 메서드가 제대로 작동하는 것 같지만 결과를 저장하는 메서드에 전달되는 두 개의 빈 문자열이 업데이트되지 않는 것 같습니다. 나는 여기에 뭔가 바보 같은 짓을하고있을거야하지만 어떤 도움을 주시면 감사하겠습니다!void 메서드는 문자열을 조작하지 않습니다.

public static void main(String[] args) { 
    String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt"; 
    String synFile = "/Users/simonrhillary/Desktop/Synonyms(2).txt"; 
    fileReader dictFR = new fileReader(); 
    fileReader synFR = new fileReader(); 
    dictFR.filePath = dictFile; 
    synFR.filePath = synFile; 
    dictFR.openFile(dictFile); 
    synFR.openFile(synFile); 
    String[] dictionary = dictFR.fileToArray(); 
    String[] synonyms = synFR.fileToArray(); 
    String regx = "^[aflmptu]+$"; 
    String regexTemplate = "^[]+$"; 
    String word1 = ""; 
    String word2 = ""; 
    synToWords(synFR.getLine(3), word1, word2);//error seems to be here. 
                 //word1 and word 2 stay "" 
    System.out.println(word1 +" " + word2); 
    printArray(findCombos(dictionary, word1, word2)); 

} 

public static void synToWords(String syn, String wordI, String wordII){ 
    String[] words = syn.split("\\t"); 
    wordI = wordI + words[0]; 
    wordII = wordII + words[1]; 
} 

내가 게시하지 않은 다른 방법이 있지만 모두 잘 작동합니다. 문제를 일으키는 synToWords 메소드 일뿐입니다. 많은 감사!

답변

7

자바 passes references by value. 그래서 라인 :

wordI = wordI + words[0]; 

wordI에 새로운 문자열을 할당하지만 만 변하는 국소 기준 (있어서 이내)에 복사한다. 원래 word1 변수는 여전히 원래 String을 참조합니다.

public static void synToWords(String syn, String[] word1And2){ 
    String[] words = syn.split("\\t"); 
    word1And2[0] = word1And2[0] + words[0]; 
    word1And2[1] = word1And2[1] + words[1]; 
} 

및 기본 코드 :

는 대신 배열을 사용할 수 있습니다, 그것이 작동되도록하려면

String[] words = { "", "" }; 
synToWords(synFR.getLine(3), words); 
System.out.println(words[0] +" " + words[1]); 

을 또는 당신은 단순히 문자열의 배열을 반환 할 수 있습니다 :

public static String[] synToWords(String syn){ 
    String[] words = syn.split("\\t"); 
    return new String[] {words[0], words[1]}; 
} 

String[] words = synToWords(synFR.getLine(3)); 
System.out.println(words[0] +" " + words[1]); 
+0

괜찮 았던 것 같은데, 내가 반환 형식을 변경하고 두 번 메서드를 실행해야 할 것 같아요? –

+1

"스캐너"를 사용하는 것이 좋습니다. –

1

Java는 전적으로 가치에 의한 호출입니다. wordI 및 wordII는 두 개의 참조 표현의 값의 사본입니다. 참조 표현식은 널 (null)이거나 오브젝트에 대한 포인터입니다. 예 :에 할당 할 때 wordTo synToWords에서 로컬 사본이 가리키는 부분 만 변경하고 있습니다.

한 가지 해결 방법은 두 조각을 포함하는 String []을 반환하는 것입니다. 그런 다음 호출자는 결과의 요소를 해당 변수에 지정할 수 있습니다.

관련 문제