Быстрый ввод в java

каковы быстрые способы ввода в 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, а затем использовать простое перенаправление оболочки для подачи консервированного ввода, чтобы вам не приходилось каждый раз вводить его заново.

Читайте также:  One admin php script

Цитата из dejavu: «BufferedReader намного быстрее, чем Scanner, потому что он буферизует символ, поэтому вам не нужно обращаться к файлу каждый раз, когда вы хотите прочитать из него символ.

Сканер особенно полезен, например, для прямого чтения примитивного типа данных, а также используется для регулярных выражений.

Я использовал как Scanner, так и BufferedReader, и BufferedReader дает значительную быструю производительность. Вы тоже можете это проверить ».

Источник

Быстрый ввод в Java

Доброго времени суток!
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.

Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:

  1. import java.io. DataInputStream ;
  2. import java.io.InputStream;
  3. class Parser
  4. final private int BUFFER_SIZE = 1
  5. private DataInputStream din;
  6. private byte [] buffer;
  7. private int bufferPointer, bytesRead;
  8. public Parser (InputStream in )
  9. din = new DataInputStream ( in );
  10. buffer = new byte [BUFFER_SIZE];
  11. bufferPointer = bytesRead = 0 ;
  12. >
  13. public String nextString( int maxSize)
  14. byte [] ch = new byte [maxSize];
  15. int point = 0 ;
  16. try
  17. byte c = read();
  18. while (c == ‘ ‘ || c == ‘\n’ || c== ‘\r’ )
  19. c = read();
  20. while (c != ‘ ‘ && c != ‘\n’ && c!= ‘\r’ )
  21. ch[point++] = c;
  22. c = read();
  23. >
  24. > catch ( Exception e) <>
  25. return new String (ch, 0 ,point);
  26. >
  27. public int nextInt()
  28. int ret = 0 ;
  29. boolean neg;
  30. try
  31. byte c = read();
  32. while (c
  33. c = read();
  34. neg = c == ‘-‘ ;
  35. if (neg)
  36. c = read();
  37. do
  38. ret = ret * 10 + c — ‘0’ ;
  39. c = read();
  40. > while (c > ‘ ‘ );
  41. if (neg) return -ret;
  42. > catch ( Exception e) <>
  43. return ret;
  44. >
  45. public long nextLong()
  46. long ret = 0 ;
  47. boolean neg;
  48. try
  49. byte c = read();
  50. while (c
  51. c = read();
  52. neg = c == ‘-‘ ;
  53. if (neg)
  54. c = read();
  55. do
  56. ret = ret * 10 + c — ‘0’ ;
  57. c = read();
  58. > while (c > ‘ ‘ );
  59. if (neg) return -ret;
  60. > catch ( Exception e) <>
  61. return ret;
  62. >
  63. private void fillBuffer()
  64. try
  65. bytesRead = din.read(buffer, bufferPointer = 0 , BUFFER_SIZE);
  66. > catch ( Exception e) <>
  67. if (bytesRead == — 1 ) buffer[ 0 ] = — 1 ;
  68. >
  69. private byte read()
  70. if (bufferPointer == bytesRead) fillBuffer();
  71. return buffer[bufferPointer++];
  72. >
  73. >

Источник

Быстрый ввод в Java

Доброго времени суток!
Данная статья будет полезна для прикладных программистов или людей, увлекающихся спортивным программированием. Она расскажет о быстром вводе данных на языке Java.

Я часто решаю задаче на сайте www.spoj.pl и иногда сталкиваюсь с проблемами скорости java. В основном это касается довольно медленного ввода данных, для некоторых задач не подходит даже StreamTokenizer.
С этой целью я написал класс, который побайтово считывает данные из потока и преобразует их в числа или строки. Как оказалось этот класс работает в несколько раз быстрее, чем scanf() в языке С++. Привожу его код ниже:

  1. import java.io. DataInputStream ;
  2. import java.io.InputStream;
  3. class Parser
  4. final private int BUFFER_SIZE = 1
  5. private DataInputStream din;
  6. private byte [] buffer;
  7. private int bufferPointer, bytesRead;
  8. public Parser (InputStream in )
  9. din = new DataInputStream ( in );
  10. buffer = new byte [BUFFER_SIZE];
  11. bufferPointer = bytesRead = 0 ;
  12. >
  13. public String nextString( int maxSize)
  14. byte [] ch = new byte [maxSize];
  15. int point = 0 ;
  16. try
  17. byte c = read();
  18. while (c == ‘ ‘ || c == ‘\n’ || c== ‘\r’ )
  19. c = read();
  20. while (c != ‘ ‘ && c != ‘\n’ && c!= ‘\r’ )
  21. ch[point++] = c;
  22. c = read();
  23. >
  24. > catch ( Exception e) <>
  25. return new String (ch, 0 ,point);
  26. >
  27. public int nextInt()
  28. int ret = 0 ;
  29. boolean neg;
  30. try
  31. byte c = read();
  32. while (c
  33. c = read();
  34. neg = c == ‘-‘ ;
  35. if (neg)
  36. c = read();
  37. do
  38. ret = ret * 10 + c — ‘0’ ;
  39. c = read();
  40. > while (c > ‘ ‘ );
  41. if (neg) return -ret;
  42. > catch ( Exception e) <>
  43. return ret;
  44. >
  45. public long nextLong()
  46. long ret = 0 ;
  47. boolean neg;
  48. try
  49. byte c = read();
  50. while (c
  51. c = read();
  52. neg = c == ‘-‘ ;
  53. if (neg)
  54. c = read();
  55. do
  56. ret = ret * 10 + c — ‘0’ ;
  57. c = read();
  58. > while (c > ‘ ‘ );
  59. if (neg) return -ret;
  60. > catch ( Exception e) <>
  61. return ret;
  62. >
  63. private void fillBuffer()
  64. try
  65. bytesRead = din.read(buffer, bufferPointer = 0 , BUFFER_SIZE);
  66. > catch ( Exception e) <>
  67. if (bytesRead == — 1 ) buffer[ 0 ] = — 1 ;
  68. >
  69. private byte read()
  70. if (bufferPointer == bytesRead) fillBuffer();
  71. return buffer[bufferPointer++];
  72. >
  73. >

Источник

Каковы быстрые способы ввода данных в 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

Источник

Оцените статью