2013-11-15 3 views
0

파일에서 문자열을 읽은 다음 1-9 또는 A-Z 또는 a-z가 아닌 것을 제거하려고하는 프로그램을 작성 중입니다. A-Z 값은 소문자 여야합니다. 모든 것이 잘 돌아가는 것처럼 보이지만 오류가 없지만 출력이 엉망입니다. 아무 이유없이 특정 문자를 건너 뛰는 것 같습니다. 나는 그것을 보았고 그것을 비틀었다. 그러나 아무것도 작동하지 않는다. if 문이 올바른 것으로 믿기 때문에 특정 문자를 무작위로 건너 뛰는 이유를 알 수 없습니다. 여기에 코드입니다 :문자열이 제대로 채워지지 않습니다.

String dataIn; 
    int temp; 
    String newstring= ""; 
    BufferedReader file = new BufferedReader(new FileReader("palDataIn.txt")); 
    while((dataIn=file.readLine())!=null) 
     { 
     newstring=""; 
     for(int i=0;i<dataIn.length();i++) 
      { 
      temp=(int)dataIn.charAt(i); 
      if(temp>46&&temp<58) 
       { 
       newstring=newstring+dataIn.charAt(i); 
       } 
      if(temp>96&&temp<123) 
       { 
       newstring=newstring+dataIn.charAt(i); 
       } 
      if(temp>64&&temp<91) 
       { 
       newstring=newstring+Character.toLowerCase(dataIn.charAt(i)); 
       } 
      i++; 
      } 
     System.out.println(newstring); 
     } 
그래서

당신에게 예를 위해, 내가 읽어 첫 번째 문자열은 다음과 같습니다

asmlietis 
:

A sample line this is. 

내 프로그램 후 출력이이입니다 통해 실행

그래서 소문자로 A를 읽고, 생각하는 것처럼 건너 뛰고, s를 읽습니다. 그런 다음 어떤 이유로 "a"와 "m"을 건너 뛰고 "p"로갑니다.

답변

4

각 블록 에서 i을 증가시키고 메인 루프 "헤더"와 마찬가지로을 추가합니다. 실제로 if 문에 대한 else 문에 i++;이 하나 있기 때문에 반복 중에 i 두 번 증가하는 경우가 있습니다.

문에서 선언 된 것 이외의 모든 i++; 문을 제거하십시오. 예 :

newstring=""; 
for(int i=0;i<dataIn.length();i++) 
{ 
    temp=(int)dataIn.charAt(i); 
    if(temp>46&&temp<58) 
    { 
     newstring=newstring+dataIn.charAt(i); 
    } 
    if(temp>96&&temp<123) 
    { 
     newstring=newstring+dataIn.charAt(i); 
    } 
    if(temp>64&&temp<91) 
    { 
     newstring=newstring+Character.toLowerCase(dataIn.charAt(i)); 
    } 
} 

나는 거기에서 편집을 멈추지 않을 것입니다. 또한 좋겠 :

  • 에 무슨 일이 훨씬 명확하게하기 위해, 당신은 비교를
  • 사용 문자 리터럴보고있는 현재 문자의 지역 변수와 같은 int 대신 char를 사용하여
  • 사용하십시오 StringBuilder
  • 사용 if/else if은 분명히 당신이있어 확인하기 위해 루프 내에서 현재 행에 대한 출력 문자열에 대한 변수를 선언 문자열
  • 을 구축하는 LY는
  • 숫자에 대한 조건을 수정 그대로 두 캐릭터를 추가 두 개의 경로를 결합 하나 지점에 갈 기대 명확성을 위해
  • 를 사용하여 더 공백 (그 순간에 잘못된입니다)
  • 그래서

에 "터키의 문제"를 방지하기 위해 toLower에서 로케일을 지정

String line; 
while((line = file.readLine()) != null) 
{ 
    StringBuilder builder = new StringBuilder(line.length()); 
    for (int i = 0; i < line.length(); i++) { 
     char current = line.charAt(i); 
     // Are you sure you want to trim 0? 
     if ((current >= '1' && current <= '9') || 
      (current >= 'a' && current <= 'z')) { 
      builder.append(current); 
     } else if (current >= 'A' && current <= 'Z') { 
      builder.append(Character.toLowerCase(current, Locale.US)); 
     } 
    } 
    System.out.println(builder); 
} 
,
+0

나는 그것을했지만 지금은 내 결과가 'asmlietis'이므로 문자를 건너 뛰고있다. – Student

+0

@Student - 아직 마지막 'i ++'을 삭제하지 않았습니다. –

+0

감사합니다. 왜 내가 for 문 내부에서 값을 늘리고 싶었는지 모르겠다. – Student

관련 문제