[java] Scanner 클래스의 next () 및 nextLine () 메서드의 차이점은 무엇입니까?

next()과 의 주요 차이점은 무엇입니까 nextLine()?
내 주요 목표는 모든 소스 (예 : 파일)에 Scanner“연결”될 수 있는를 사용하여 모든 텍스트를 읽는 것입니다 .

어느 것을 선택해야하며 그 이유는 무엇입니까?



답변

나는 항상 입력을 읽고 nextLine()문자열을 파싱하는 것을 선호 합니다.

를 사용 next()하면 구분 기호 앞에 오는 것만 반환합니다 (기본값은 공백). nextLine()현재 라인을 반환 한 후 자동으로 스캐너를 아래로 이동합니다.

에서 분석 데이터에 대한 유용한 도구가 nextLine()될 것이다 str.split("\\s+").

String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces

Scanner 클래스 또는 String 클래스에 대한 자세한 내용은 다음 링크를 참조하십시오.

스캐너 : http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

문자열 : http://docs.oracle.com/javase/7/docs/api/java/lang/String.html


답변

next()공간까지만 입력을 읽을 수 있습니다. 공백으로 구분 된 두 단어를 읽을 수 없습니다. 또한 next()입력을 읽은 후 커서를 같은 줄에 놓습니다.

nextLine()단어 사이의 공백을 포함하여 입력을 읽습니다 (즉, 줄 끝까지 읽음 \n). 입력을 읽으면 nextLine()커서를 다음 줄에 놓습니다.

전체 줄을 읽으려면 nextLine().


답변

JavaDoc에서 :

  • A Scanner는 기본적으로 공백과 일치하는 구분 기호 패턴을 사용하여 입력을 토큰으로 나눕니다.
  • next():이 스캐너에서 다음 완전한 토큰을 찾아 반환합니다.
  • nextLine(): 현재 줄을 지나서이 스캐너를 진행하고 건너 뛴 입력을 반환합니다.

따라서의 경우 "small example<eol>text" next()“small” nextLine()을 반환하고 “small example”을 반환해야합니다.


답변

next ()를 제외하고는 nextLine ()이 전체 라인을 스캔하는 공간까지만 스캔한다는 점 은 nextLine ()이 완전한 토큰을 기다리지 않고 ‘\ n’일 때 완전한 토큰을 얻을 때까지 대기 한다는 것입니다. (즉, Enter 키를 누르면) 스캐너 커서가 다음 줄로 이동하고 건너 뛴 이전 줄로 돌아갑니다. 완전한 입력을 제공했는지 여부를 확인하지 않습니다. 심지어 next ()가 빈 문자열을 사용하지 않는 빈 문자열을 사용합니다.

public class ScannerTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        String []str = new String[cases];
        for(int i=0;i<cases;i++){
            str[i]=sc.next();
        }
     }

}

for 루프에서 next ()와 nextLine ()을 변경하여이 프로그램을 시도하고, 아무 입력없이 엔터 키 인 ‘\ n’을 계속 누르면 주어진 수의 경우를 누른 후 종료되는 nextLine () 메소드 를 사용할 수 있습니다 . 로 다음 () doesnot 종료 의 경우, 지정된 번호를 여기에 당신이 제공 전까지 입력합니다.


답변

요점은 메서드가 중지되는 위치와 메서드를 호출 한 후 커서가있는 위치를 찾는 것입니다.

모든 메서드는 커서 위치와 다음 기본 구분 기호 (공백, 탭, \ n–Enter를 눌러 생성됨) 사이에 공백을 포함하지 않는 정보를 읽습니다. 커서 nextLine()는 커서 위치와 \ n 사이의 정보 (구분자에 의해 생성 된 공백 포함)를 읽는를 제외하고 구분자 앞에 멈추고 커서는 \ n 뒤에 멈 춥니 다.


예를 들어, 다음 그림을 고려하십시오.

|23_24_25_26_27\n

| -> 현재 커서 위치

_ -> 공백

스트림 -> 굵게 (호출 메서드에서 얻은 정보)

다음 메서드를 호출하면 어떻게되는지 확인하세요.

nextInt()

23 읽기 | _24_25_26_27 \ n

nextDouble()

23_ 읽기 (24) _25_26_27 \ n을 |

next()

23_24_ 25 읽기 | _26_27 \ n

nextLine()

23_24_25 _26_27 읽기 \ n |


그런 다음 요구 사항에 따라 메서드를 호출해야합니다.


답변

간단히 말해서 길이 t의 문자열 배열을 입력하는 경우 Scanner # nextLine ()은 t 줄을 예상하고 문자열 배열의 각 항목은 Enter 키로 다른 항목과 구분되며 Scanner # next ()는 다음까지 입력을 계속받습니다. Enter 키를 누르면 공백으로 구분 된 배열 내부에 문자열 (단어)이 저장됩니다.

다음 코드 스 니펫을 살펴 보겠습니다.

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.next();
    }

IDE에서 코드 스 니펫 위를 실행할 때 (문자열 길이 2에 대해 말할 수 있음) 내 문자열을 다음과 같이 입력하는지 여부는 중요하지 않습니다.

입력 :-abcd abcd 또는

다음과 같이 입력하십시오.

abcd

abcd

출력은 abcd와 같습니다.

abcd

그러나 동일한 코드에서 next () 메서드를 nextLine ()으로 대체하면

    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.nextLine();
    }

그런 다음 프롬프트에 다음과 같이 입력하면-abcd abcd

출력은 다음과 같습니다.

abcd abcd

프롬프트에 abcd로 입력을 입력하면 (그리고 Enter 키를 눌러 다른 줄에 다음 abcd를 입력하면 입력 프롬프트가 종료되고 출력이 표시됩니다)

출력은 다음과 같습니다.

abcd


답변

에서 의 javadoc

next () 지정된 문자열에서 생성 된 패턴과 일치하면 다음 토큰을 반환합니다. nextLine () 현재 행을지나이 스캐너를 진행시키고 건너 뛴 입력을 리턴합니다.

당신이 선택하는 것은 당신의 필요에 가장 적합한 것이 무엇인지에 달려 있습니다. 내가 전체 파일을 읽는다면 모든 파일을 가질 때까지 nextLine으로 갈 것입니다.