каковы быстрые способы ввода в 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 ответов
В приведенной ниже статье автор обсуждает три различных способа чтения ввода от пользователя в среде командной строки (также известной как «консоль»). Каждый способ довольно прост в использовании, а также имеет свои преимущества и недостатки.
Ниже обсуждаются механизмы и приводятся примеры. Также есть раздел за и против.
Scanner reader = new Scanner(System.in); // Reading from System.in System.out.println("Enter a number: "); int n = reader.nextInt();
DataInputStream dis = new DataInputStream(System.in); int i = dis.readInt();
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());
Это повторяющийся вопрос, и оптимизированный способ чтения и записи данных в java можно найти по ссылке ниже.
Эти классы очень полезны при чтении входных и выходных данных в соревнованиях по программированию.
Самый быстрый способ ввести пользовательский ввод в 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); >
Если вам нужен быстрый способ ввода через стандартный ввод (и, если я правильно вас понял, вам нужен быстрый способ многократной подачи вводимых данных в свои программы), лучше всего направить или перенаправить готовые ответы например
Так что вы можете создать свой класс для интерактивного ввода через stdin, а затем использовать простое перенаправление оболочки для подачи консервированного ввода, чтобы вам не приходилось каждый раз вводить его заново.
Цитата из dejavu: «BufferedReader намного быстрее, чем Scanner, потому что он буферизует символ, поэтому вам не нужно обращаться к файлу каждый раз, когда вы хотите прочитать из него символ.
Сканер особенно полезен, например, для прямого чтения примитивного типа данных, а также используется для регулярных выражений.
Я использовал как Scanner, так и BufferedReader, и BufferedReader дает значительную быструю производительность. Вы тоже можете это проверить ».
Быстрый ввод в Java
Доброго времени суток!
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.
Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:
- import java.io. DataInputStream ;
- import java.io.InputStream;
- class Parser
- final private int BUFFER_SIZE = 1
- private DataInputStream din;
- private byte [] buffer;
- private int bufferPointer, bytesRead;
- public Parser (InputStream in )
- din = new DataInputStream ( in );
- buffer = new byte [BUFFER_SIZE];
- bufferPointer = bytesRead = 0 ;
- >
- public String nextString( int maxSize)
- byte [] ch = new byte [maxSize];
- int point = 0 ;
- try
- byte c = read();
- while (c == ‘ ‘ || c == ‘\n’ || c== ‘\r’ )
- c = read();
- while (c != ‘ ‘ && c != ‘\n’ && c!= ‘\r’ )
- ch[point++] = c;
- c = read();
- >
- > catch ( Exception e) <>
- return new String (ch, 0 ,point);
- >
- public int nextInt()
- int ret = 0 ;
- boolean neg;
- try
- byte c = read();
- while (c
- c = read();
- neg = c == ‘-‘ ;
- if (neg)
- c = read();
- do
- ret = ret * 10 + c — ‘0’ ;
- c = read();
- > while (c > ‘ ‘ );
- if (neg) return -ret;
- > catch ( Exception e) <>
- return ret;
- >
- public long nextLong()
- long ret = 0 ;
- boolean neg;
- try
- byte c = read();
- while (c
- c = read();
- neg = c == ‘-‘ ;
- if (neg)
- c = read();
- do
- ret = ret * 10 + c — ‘0’ ;
- c = read();
- > while (c > ‘ ‘ );
- if (neg) return -ret;
- > catch ( Exception e) <>
- return ret;
- >
- private void fillBuffer()
- try
- bytesRead = din.read(buffer, bufferPointer = 0 , BUFFER_SIZE);
- > catch ( Exception e) <>
- if (bytesRead == — 1 ) buffer[ 0 ] = — 1 ;
- >
- private byte read()
- if (bufferPointer == bytesRead) fillBuffer();
- return buffer[bufferPointer++];
- >
- >
Быстрый ввод в Java
Доброго времени суток!
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.
Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:
- import java.io. DataInputStream ;
- import java.io.InputStream;
- class Parser
- final private int BUFFER_SIZE = 1
- private DataInputStream din;
- private byte [] buffer;
- private int bufferPointer, bytesRead;
- public Parser (InputStream in )
- din = new DataInputStream ( in );
- buffer = new byte [BUFFER_SIZE];
- bufferPointer = bytesRead = 0 ;
- >
- public String nextString( int maxSize)
- byte [] ch = new byte [maxSize];
- int point = 0 ;
- try
- byte c = read();
- while (c == ‘ ‘ || c == ‘\n’ || c== ‘\r’ )
- c = read();
- while (c != ‘ ‘ && c != ‘\n’ && c!= ‘\r’ )
- ch[point++] = c;
- c = read();
- >
- > catch ( Exception e) <>
- return new String (ch, 0 ,point);
- >
- public int nextInt()
- int ret = 0 ;
- boolean neg;
- try
- byte c = read();
- while (c
- c = read();
- neg = c == ‘-‘ ;
- if (neg)
- c = read();
- do
- ret = ret * 10 + c — ‘0’ ;
- c = read();
- > while (c > ‘ ‘ );
- if (neg) return -ret;
- > catch ( Exception e) <>
- return ret;
- >
- public long nextLong()
- long ret = 0 ;
- boolean neg;
- try
- byte c = read();
- while (c
- c = read();
- neg = c == ‘-‘ ;
- if (neg)
- c = read();
- do
- ret = ret * 10 + c — ‘0’ ;
- c = read();
- > while (c > ‘ ‘ );
- if (neg) return -ret;
- > catch ( Exception e) <>
- return ret;
- >
- private void fillBuffer()
- try
- bytesRead = din.read(buffer, bufferPointer = 0 , BUFFER_SIZE);
- > catch ( Exception e) <>
- if (bytesRead == — 1 ) buffer[ 0 ] = — 1 ;
- >
- private byte read()
- if (bufferPointer == bytesRead) fillBuffer();
- return buffer[bufferPointer++];
- >
- >
Каковы быстрые способы ввода данных в 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 ответов
В статье ниже автор обсуждает три различных способа чтения ввода от пользователя в среде командной строки (также известной как «консоль»). Каждый способ довольно прост в использовании, а также имеет свои преимущества и недостатки.
Ниже обсуждаются механизмы и приводятся примеры. Также есть раздел за и против.
Scanner reader = new Scanner(System.in); // Reading from System.in System.out.println("Enter a number: "); int n = reader.nextInt();
DataInputStream dis = new DataInputStream(System.in); int i = dis.readInt();
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());
Если вам нужен быстрый способ ввода с помощью stdin (и, если я правильно вас понимаю, вам нужен быстрый способ многократной подачи входных данных в ваши программы), лучше всего направлять или перенаправлять стандартные ответы, например
так что вы можете создать свой класс для интерактивного ввода через stdin, а затем использовать простое перенаправление оболочки для подачи в стандартный ввод, так что вам не придется каждый раз вводить его заново.
Цитата из dejavu: «BufferedReader намного быстрее, чем Scanner, потому что он буферизует символ, поэтому вам не нужно обращаться к файлу каждый раз, когда вы хотите прочитать символ из него.
Сканер особенно полезен, например, для непосредственного чтения примитивного типа данных, а также для регулярных выражений.
Я использовал Scanner и BufferedReader как и BufferedReader дает значительную высокую производительность. Вы тоже можете проверить это сами «.
Самый быстрый способ получить пользовательский ввод в 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); >
Это повторяющийся вопрос, и оптимизированный способ чтения и записи данных в Java можно найти по ссылке ниже.
Эти классы очень полезны при чтении входных данных и записи выходных данных в соревнованиях по программированию.
Быстрый ввод в java
Alickon → How to explain that
cry → Codeforces Round 887 (Div 1, Div 2) Tutorial
cry → Invitation to Codeforces Round 887 (Div. 1, Div. 2)
MikeMirzayanov → Изменение правил об использовании стороннего кода в соревнованиях Codeforces
lOthBroK286 → Cheaters Cheat OPENLY .
pegasus7d → Hamiltonian Tour Kickstart 2022 Round B
thanhdno → Practice harder problems
cupcake123 → Python3 and Py-Py
orz → Codeforces Round 887 (Div. 1) — Screencast & Editorial
platelet → CodeTON Round 5 Editorial
kabeer27 → Solution Same with another Person, What should i do?
AkiLotus → Reflection on my past authored problems
Errichto → [GYM] 100 Easy Problems (Bootcamp)
roycf123 → Implementation problem of the Dijkstra Algorithm
adamant → Implementing Dinitz on bipartite graphs
minhcool → IOI 2023 teams
donovilia2007 → Первое достижение на платформе codeforces
Halym2007 → What is your training schedule?
unknown_0077 → Need Help
ahmad_alghadban → [GYM] HIAST Collegiate Programming Contest 2023
AkiLotus → Codeforces Round #538 (Div. 2) Editorial
simonlindholm → EGOI 2023 results and problems
namannirwal → SWITCHING BETWEEN RATING 200 to 500 from the past 4 months !
mesanu → Codeforces Round #886 (Div. 4) Editorial
cerealguy → MemSQL Start[c]UP 3.0 Round 2 Editorial