Zaham2
Zaham2

Reputation: 347

How to take multi-line input in Java

I'm trying to take multi-line user input in Java and split the lines into an array, I need this to solve a problem for an online judge. I'm using a Scanner to take input. I cant determine the end of input. I always get an infinite loop, since I don't know the size of input (i.e number of lines)

Terminating input with an empty String (clicking enter) is still an infinite loop. Code provided below.

  public static void main(String[] args) {

        ArrayList<String> in = new ArrayList<String>();
        Scanner s = new Scanner(System.in);

        while (s.hasNextLine() == true){
            in.add(s.nextLine());
            //infinite loop
        }
    }

I'm not even sure why the loop executes the first time. I believe the hasNextLine() should be false the first time ,since no input was taken yet. Any help or clarification appreciated.

Upvotes: 1

Views: 12944

Answers (4)

lczapski
lczapski

Reputation: 4120

You can do somthing like this:

        while (s.hasNextLine() == true){
            String line = s.nextLine();
            if ("".equals(line)) {
                break;
            }
            in.add(line);
            //infinite loop
        }

Upvotes: 1

Maxouille
Maxouille

Reputation: 2911

You can use this code. It returns when the user press Enter on an empty line.

import java.util.Scanner;
import java.util.ArrayList;
public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        ArrayList<String> arrayLines = new ArrayList<>();
        String line;
        while(true){
            line = scanner.nextLine();
            if(line.equals("")){
                break;
            }
            else {
              System.out.println(line);
              arrayLines.add(line);
            }
        }
        System.out.println(arrayLines);
    }  
}

Best

Upvotes: 1

Coronero
Coronero

Reputation: 160

You could use the empty line as a loop-breaker:

while (s.hasNextLine()){ //no need for "== true"
    String read = s.nextLine();
    if(read == null || read.isEmpty()){ //if the line is empty
        break;  //exit the loop
    }
    in.add(read);
    [...]
}

Upvotes: 5

A_C
A_C

Reputation: 925

You could end the loop with something like below. Here, the String "END" (case-insenstive) is used to signify end of the multi-line content:

public static void main(String[] args) {

        ArrayList<String> in = new ArrayList<String>();
        Scanner s = new Scanner(System.in);

        while (s.hasNextLine()) {
            String line = s.nextLine();
            in.add(line);

            if (line != null && line.equalsIgnoreCase("END")) {
                System.out.println("Output list : " + in);
                break;
            }

        }

    }

Upvotes: 1

Related Questions