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

Эти классы очень полезны при чтении входных данных и записи выходных данных в соревнованиях по программированию.

Другие вопросы по тегам