Abstract
In the following I will describe how to read the input in Java. We will examine the Scanner class and then write our own class for faster input reading.
Using the Scanner class
We can read the input using the Scanner class:
import java.util.*;
public class Main{
public static void main(String[] args) {
// Use the Scanner class
Scanner sc = new Scanner(System.in);
/*
int n = sc.nextInt(); // read input as integer
long k = sc.nextLong(); // read input as long
double d = sc.nextDouble(); // read input as double
String str = sc.next(); // read input as String
String s = sc.nextLine(); // read whole line as String
*/
}
}
Using the BufferedReader class
However, the Scanner class is slow and may cause a "timelimit exceeded". We can read the input faster with the BufferedReader class. The class "MyScanner" below uses a BufferedReader. The same method names as in the Scanner class have been chosen, e.g. to read the input as an integer we still can use nextInt().
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) {
MyScanner sc = new MyScanner();
out = new PrintWriter(new BufferedOutputStream(System.out));
// Start writing your solution here. -------------------------------------
/*
int n = sc.nextInt(); // read input as integer
long k = sc.nextLong(); // read input as long
double d = sc.nextDouble(); // read input as double
String str = sc.next(); // read input as String
String s = sc.nextLine(); // read whole line as String
int result = 3*n;
out.println(result); // print via PrintWriter
*/
// Stop writing your solution here. -------------------------------------
out.close();
}
//-----------PrintWriter for faster output---------------------------------
public static PrintWriter out;
//-----------MyScanner class for faster input----------
public static class MyScanner {
BufferedReader br;
StringTokenizer st;
public MyScanner() {
br = new BufferedReader(new InputStreamReader(System.in));
}
String next() {
while (st == null || !st.hasMoreElements()) {
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
String nextLine(){
String str = "";
try {
str = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return str;
}
}
//--------------------------------------------------------
}
References
FastScanner class used by xenoslash.
Faster input for java – An article by James Brucker
If you know of a simpler/better method for input reading in Java, please post it below.
Edit 1 (30 August 2014)
I added PrintWriter
for a faster output.
thanks a lot. could you explain the next() function.
i don't understand why while (st == null || !st.hasMoreElements()) especially !st.hasMoreElements() this part.
and how it is working ? like — int a = sc.nextInt(); int b = sc.nextInt();
if i gave input 1 2 then how can this do like a = 1 and b = 2 ? every time i call nextInt() then it call next() in a new form. so how it can split the output and put those in different variable ? thanks in advance.
What is
st
? It'sStringTokenizer
. Read its javadocs.Suppose you had the input
Then you can read it like this:
If you have multiple lines, let's say n=3 such lines as above, then you can use a for loop. Input:
In the first line we read the number n which tells us how many lines will follow. With a for loop we will read the other numbers:
Green tutorial? lol
great tutorial! Thx a lot for sharing! So are we allowed to use your code for contest? :-)
Sure, feel free to use it.
Thx!
Here is one for Scala: https://github.com/pathikrit/better-files/blob/master/src/main/scala/better/files/Scanner.scala
Awesome. Thanks a lot.
I could not understand the while loop part. Could anyone explain me that?
Thanks a lot. You save my day.
Hi everyone i am not able to submit my code because there is Runtime error
Codeforces round 65
A — Way Too Long Words
Submission Id :- 76778006
There is an issue regarding input when i run it from eclipse , as
the last line of input is not read until i hit enter button.
Please can anyone help me out , I am new to codeforces and i know i am making a naive mistake.
please add for character ??