2012-01-04 2 views
2

저는 암호를 사용하여 암호 해독 프로그램을 만들고 있습니다. 암호 해독 프로그램은 내 마스터의 숙제로 java를 사용하고 있습니다. 어쨌든, 나는 무의미한 공백을 삭제하고 String을 적절한 JTextArea로 표시하는 메서드를 사용합니다. 이 방법은 작은 텍스트에 적합하지만 더 큰 텍스트 (.txt 파일에서로드)를 사용할 때 StringIndexOutOfBoundsException을 제공합니다. 누구든지 도와 줄 수 있습니까? 미리 감사드립니다. StringIndexOutOfBoundsException, 문자열 메서드에서 공백을 삭제합니다.

public void Data(String s) { 
    System.out.print("Analysis" + "\n" + s); 
    jTextArea1.setText(s); 
    StringBuilder buf = new StringBuilder(); 
    for (int i = 0; i < s.length(); i++) { 
     if (!Character.isWhitespace(s.charAt(i))) { 
      buf.append(s.charAt(i)); 
     } else if (Character.isWhitespace(s.charAt(i)) && !Character.isWhitespace(s.charAt(i + 1))) { 
      buf.append(s.charAt(i)); 
     } 
    } 
    System.out.println(buf.toString() + "\n" + "from buf"); 
    jTextArea1.setText(buf.toString()); 
} 
+0

당신은's.charAt (i + 1)'을 읽습니다. 따라서 문자열의 마지막 문자가 공백 문자이면 범위를 벗어납니다. 'i + 1 == s.length()'라면's.charAt (i + 1)'을 읽을 수 없다. –

답변

1

for 루프에서는 s.length()까지 가고 두 번째 if 문에서는 s.charAt(i + 1)에 액세스합니다. s.length() - 1까지만 입력하십시오 :

for (int i = 0; i < s.length() - 1; i++) { 
    if (!Character.isWhitespace(s.charAt(i))) { 
     buf.append(s.charAt(i)); 
    } else if (Character.isWhitespace(s.charAt(i)) && !Character.isWhitespace(s.charAt(i + 1))) { 
     buf.append(s.charAt(i)); 
    } 
} 

그런 다음 마지막 문자를 확인하십시오.

+0

튜더 추수 감사절. 그것은 일했다 !!!! –

+0

그냥 문자열의 마지막 문자를 잃어 버리는 문제입니다. : S –

+0

마지막 문자를 수동으로 추가합니다. 의미 : buf.append (s.charAt (s.length() - 1))); –

0

당신은 당신이 당신의 문자열 길이의 문자에 1을 더한

+1

알았습니다. 고맙습니다. –

1

s.charAt(i + 1)에 액세스하는 뜻이 문

Character.isWhitespace(s.charAt(i + 1) 

를 사용하는 !Character.isWhitespace(s.charAt(i + 1))

에서 :

는 방법

일 때 실패합니다.

휠을 다시 제작하는 대신 s.replaceAll("\\s\\s+"," ")을 사용할 수 있습니다.

+1

답변 해 주셔서 감사합니다. –

+0

원본 문자열의 "\\ s +"로 충분합니다. 추가로 단일 선행 및 후행 공백을 없애기 위해 문자열을 다듬을 수도 있습니다. –

+0

@ 주하 라이 호 : 맞습니다. 더 많은 문자열이 대체되어야하기 때문에 더 확장적 일 수 있습니다 : 또 다른 하나의 공백 문자열을 위해 한 공간을 대체해야합니다. jvm/컴파일러가이를 최적화하고 이러한 경우를 무시할 수 있습니다. 그러나이 모든 경우에 확실하지 않습니다. – amit

0
hi i hope you can use the below one, instead the above 

//StringBuilder buf = new StringBuilder(); 
/* These lines are not needed 
    for (int i = 0; i < s.length(); i++) { 
     if (!Character.isWhitespace(s.charAt(i))) { 
      buf.append(s.charAt(i)); 
     } else if (Character.isWhitespace(s.charAt(i)) && !Character.isWhitespace(s.charAt(i + 1))) { 
      buf.append(s.charAt(i)); 
     }`enter code here` 
    } 
*/ 
s = s.replaceAll("\\s+"," "); 
// Whenever you print the object(reference) toString() method is called by default. so no need to call explicitly 
// System.out.println(buf.toString() + "\n" + "from s"); 
    System.out.println(s + "\n" + "from buf"); 
// jTextArea1.setText(s); 
    jTextArea1.setText(s); 
+0

이것은 해결책입니다. 하지만 난 \ n 문자를 풀 것입니다. –

관련 문제