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.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
I could not understand the while loop part. Could anyone explain me that?
Sorry for necroposting. But I thought it will be nice to have an explanation as I see 2 people asking for it.
I know I am late. But this is for anyone else who might not understand it.
String next() throws IOException { while (!in.hasMoreTokens()) { in = new StringTokenizer(br.readLine()); } return in.nextToken(); } i think this one is better
Thanks a lot. You save my day.
please add for character ??
you can't read char. you can do like this: char c = next().charAt(0);
How to read input character wise like;-a b c d e ?
Add into string and split???
yep