2014-09-09 1 views
1

스캐너를 사용하여 파일의 입력을 읽으려고하지만 스캐너가 모든 것을 무시하도록합니다 (* ....... *). 어떻게해야합니까? 정수를 가져 와서 배열 목록에 추가하고 있습니다. 그러나 텍스트 안에 정수가 있으면 무시하고 싶습니다.스캐너가 특정 패턴 사이의 단어를 무시하도록하는 방법

public ArrayList<Integer> readNumbers(Scanner sc) 
    { 
     // TODO Implement readNumbers 
     ArrayList<Integer> list = new ArrayList<Integer>(); 
     while(sc.hasNext()) 
     { 
      try 
      { 
       String temp = sc.next(); 
       list.add(Integer.parseInt(temp)); 
      } 
      catch(Exception e) 
      { 

      } 
     } 
     return list; 
    } 

다음은 텍스트 파일 4802740

내 배열 목록에 21 4802740를 추가

(2013 *에서 * 21 알라바마 인구)의 예 선이다. 사용에 대해 생각했습니다. sc.usedelimiter ("("); sc.usedelimiter (")"); 그러나 나는 그것을 작동시킬 수없는 것 같습니다. 감사합니다.

+0

입력 내용이 모두 같은 패턴입니까? 그래서 (* 2013 Los Angles in * 2013) 4802743이 맞습니까? –

+0

시작이나 끝 부분에'(* ... *)'부분에'*'가있을 수 있습니까? – Pshemo

+0

'21'과 '4802740을 내 배열 목록에 추가하겠다'는 의미를 설명 할 수 있습니까? '2013'이 아닌 '21'이 결과에 포함되어야하기 때문입니다. 그렇게한다면 당신은 그것을 설명 할 어떤 논리를 우리에게 줄 수 있습니까? – Pshemo

답변

0

당신이

sc.useDelimiter("\\(\\*[^*]*\\*\\)|\\s+"); 

처럼 뭔가를이 정규 표현식 \\(\\*[^*]*\\*\\)보고 될 수 있음을 보인다하는 부분을 나타내는

  • \\(\\* - 시작은 (*,
  • \\*\\)은 - *)
  • [^*]*로 끝나는 - 내부 0 개 이상의 비 * 문자가 있습니다.

또한 하나 이상의 공백을 구분할 수 있도록 |\\s+을 추가했습니다 (이 구분 기호는 기본적으로 스캐너에서 사용됩니다).


컨트롤 흐름의 주요 부분으로 try-catch를 사용하는 것은 일반적으로 잘못된 것으로 간주됩니다. 대신 코드를 다음과 같이 변경해야합니다.

while (sc.hasNext()) { 
    if(sc.hasNextInt()) { 
     list.add(sc.nextInt()); 
    } else { 
     //consume data you are not interested in 
     //so Scanner could move on to next tokens 
     sc.next(); 
    } 
} 
+0

이 맘에 든다하지만 그냥 추출한다 4802740 –

+0

정확하게 OP가 원하는 것처럼 보이는 @KickButtowski "* 스캐너가 모든 것을 무시하도록 (* ....... *). *" – Pshemo

+0

op가 21도 필요함 –

0

다음은 INT 읽기 전에 "(* 문자열 *)"를 생략 :

try 
{ 
    try { 
     sc.skip("\\s*\\(\\*[^*]*\\*\\)"); 
    } catch (NoSuchElementException e) { 
    } 
    String temp = sc.next(); 
    list.add(Integer.parseInt(temp)); 
} catch (Exception e) { 
} 
+0

은 좋아하지만 그냥 추출합니다. 4802740 –

+0

다음 토큰을 구문 분석하기 전에 "모든 공백을 제외하고 (* ... *)"를 건너 뜁니다. – folkol

관련 문제