Каковы быстрые способы ввода данных в Java?
В 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());
но для получения такого ввода требуется много времени. Я хотел бы знать более быстрый способ ввода информации. заранее спасибо
Редактировать: я видел лучших Java-кодеров, таких как UWI, которые воспринимают ввод совсем другим способом. Они вроде создают свой собственный класс читателей. Я не понимаю, как их программа становится быстрой во время выполнения.
5 ответов
В статье ниже автор обсуждает три различных способа чтения ввода от пользователя в среде командной строки (также известной как "консоль"). Каждый способ довольно прост в использовании, а также имеет свои преимущества и недостатки.
Ниже обсуждаются механизмы и приводятся примеры. Также есть раздел за и против.
Ссылка: http://www.codejava.net/java-se/file-io/3-ways-for-reading-input-from-the-user-in-the-console
Ссылка: самый эффективный способ получения пользовательского ввода в 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 console = System.console();
String s = console.readLine();
int i = Integer.parseInt(console.readLine());
Если вам нужен быстрый способ ввода с помощью stdin (и, если я правильно вас понимаю, вам нужен быстрый способ многократной подачи входных данных в ваши программы), лучше всего направлять или перенаправлять стандартные ответы, например
$ java MyReadingClass < mycannedinput.txt
так что вы можете создать свой класс для интерактивного ввода через stdin, а затем использовать простое перенаправление оболочки для подачи в стандартный ввод, так что вам не придется каждый раз вводить его заново.
Цитата из dejavu: "BufferedReader намного быстрее, чем Scanner, потому что он буферизует символ, поэтому вам не нужно обращаться к файлу каждый раз, когда вы хотите прочитать символ из него.
Сканер особенно полезен, например, для непосредственного чтения примитивного типа данных, а также для регулярных выражений.
Я использовал Scanner и BufferedReader как и BufferedReader дает значительную высокую производительность. Вы тоже можете проверить это сами ".
from: какой выбрать буферизованный ридер или сканер с точки зрения производительности
Самый быстрый способ получить пользовательский ввод в java, в частности в конкурентном кодировании, - создать собственный класс FastReader с использованием bufferedReader и StringTokenizer.
Этот метод использует преимущество времени 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/
Это повторяющийся вопрос, и оптимизированный способ чтения и записи данных в Java можно найти по ссылке ниже.
/questions/6462109/kakoj-samyij-byistryij-sposob-chteniya-iz-systemin-na-java/6462123#6462123
Эти классы очень полезны при чтении входных данных и записи выходных данных в соревнованиях по программированию.