在Java中,我使用标准Scanner
和BufferedReader
类来获取输入,如:
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
或
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int a=Integer.parseInt(br.readLine());
但是接受这样的输入需要大量的运行时间。我想知道更快的输入方式。提前致谢
编辑:我见过像uwi这样的顶级java程序员以非常不同的方式接受输入。他们有点创建自己的读者课程。我不明白他们的程序在运行时变得如此快。
答案 0 :(得分:3)
来自dejavu的引用: “BufferedReader比Scanner快很多,因为它可以缓冲字符,因此每次你想从中读取字符时都不必访问该文件。
扫描仪特别有用,例如直接读取原始数据类型,也用于正则表达式。
我已经使用了Scanner和BufferedReader,BufferedReader提供了显着的快速性能。你也可以自己测试一下。“
从:which to choose buffered reader or scanner from performance point of view
答案 1 :(得分:3)
在下面的文章中,作者讨论了在命令行环境(也称为“控制台”)中从用户读取输入的三种不同方法。每种方式都相当容易使用,也有自己的优点和缺点。
讨论了以下机制并提供了示例。 还有一个利弊部分。
链接: http://www.codejava.net/java-se/file-io/3-ways-for-reading-input-from-the-user-in-the-console
链接: Most Efficient Way of Taking User Input in Java
选项:
扫描仪类 - >
Scanner reader = new Scanner(System.in); // Reading from System.in
System.out.println("Enter a number: ");
int n = reader.nextInt();
DataInputStream->
DataInputStream dis = new DataInputStream(System.in);
int i = dis.readInt();
BufferedReader - >
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter your name: ");
String name = reader.readLine();
System.out.println("Your name is: " + name);
控制台 - >
Console console = System.console();
String s = console.readLine();
int i = Integer.parseInt(console.readLine());
答案 2 :(得分:3)
如果你想要一个快速方式通过stdin输入(如果我理解你正确,你想要一个快速的方法来重复输入你的程序的输入),你最好的选择是管道或重定向固定响应,例如
$ java MyReadingClass < mycannedinput.txt
所以你可以构建你的类来通过stdin获取交互式输入,然后使用简单的shell重定向来输入预设输入,这样你就不必每次都重新输入它。
答案 3 :(得分:1)
在java中采用userinput进行特别有竞争力的编码的最快方法是使用 bufferedReader和StringTokenizer 制作自己的FastReader类。
此方法使用BufferedReader和StringTokenizer的时间优势以及用户定义方法的优势,可以减少输入,从而实现更快的输入。这可以在1.23秒的时间内被接受,并且非常推荐这种方法,因为它易于记忆并且足够快以满足竞争性编码中大多数问题的需要。
实施:
static class FastReader
{
BufferedReader br;
StringTokenizer st;
public FastReader()
{
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;
}
}
在主文件中:
public static void main(String[] args)
{
FastReader s=new FastReader();
int n = s.nextInt();
int k = s.nextInt();
int count = 0;
while (n-- > 0)
{
int x = s.nextInt();
if (x%k == 0)
count++;
}
System.out.println(count);
}
来源链接:https://www.geeksforgeeks.org/fast-io-in-java-in-competitive-programming/
答案 4 :(得分:0)
这是一个重复的问题,可以在下面的链接中找到在java中读写数据的优化方法。
https://stackoverflow.com/a/49957378/5076337
这些类在编程竞赛中读取输入和写入输出时非常有用。