📜  使用Java 8 高效读取竞争性编程的输入

📅  最后修改于: 2022-05-13 01:55:05.373000             🧑  作者: Mango

使用Java 8 高效读取竞争性编程的输入

众所周知,在解决任何 CP 问题时,第一步是收集输入或读取输入。我们都会犯的一个常见错误是在编写代码和编译时花费太多时间。在Java,建议使用 BufferedReader 而不是 Scanner 来接受用户的输入。为什么?在我们之前的一篇文章中对此进行了讨论。 (此外,与Java.util.Scanner 相关的问题是可用的)但为了更好地理解,我们将在本文中介绍这两种实现。

读取输入的方式

  • 使用 Scanner 类
  • 使用 BufferedReader 类
  • 在流的帮助下使用 BufferedReader 类(更优化)

现在让我们讨论通过提供干净的Java程序和感知从自定义输入生成的输出来单独深入阅读的方法。

方式一:简单的扫描仪输入读取

Java.util.Scanner 类提供了从控制台读取原始数据以及文本行的内置方法。在下面的代码片段中,让我们了解它是如何完成的。



例子

Java
// Java Program Illustrating Reading Input
// Using Scanner class
  
// Importing Arrays and Scanner class
// from java.util package
import java.util.Arrays;
import java.util.Scanner;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
    {
        // Creating object of Scanner class
        Scanner scan = new Scanner(System.in);
  
        // Basic Input Reading
        int a = scan.nextInt();
        float b = scan.nextFloat();
  
        System.out.println("Integer value: " + a);
        System.out.println("Float value: " + b);
  
        // Space Separated Input Reading
        int[] arr = new int[5];
  
        for (int i = 0; i < arr.length; i++) {
            arr[i] = scan.nextInt();
        }
  
        System.out.println(Arrays.toString(arr));
    }
}


Java
// Java Program Illustrating Reading Input
// Using
  
// Importing required classes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
        throws IOException
    {
  
        // Reading input via BufferedReader class
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
  
        // Basic Input Reading
        int a = Integer.parseInt(br.readLine());
        float b = Float.parseFloat(br.readLine());
  
        // Print above input values in console
        System.out.println("Integer value: " + a);
        System.out.println("Float value: " + b);
  
        // Space Separated Input Reading
        int[] arr = new int[5];
        String[] strArr = br.readLine().split(" ");
  
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(strArr[i]);
        }
  
        // Printing the eleemnts in array
        // using toString() method
        System.out.println(Arrays.toString(arr));
    }
}


Java
// Java Program to Read Separated Data
// Using BufferedReader class voa enhanced for loopd
  
// Importing required classes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
        throws IOException
    {
  
        // Reading input separated by space
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
  
        // Storing in array
        int[] arr = Stream.of(br.readLine().split(" "))
                        .mapToInt(Integer::parseInt)
                        .toArray();
        System.out.println(Arrays.toString(arr));
  
        // Using streams concepts to parse map to integer
        // later on collecting via Collectors via toList()
        // method and storing it an integer list
        List arrayList
            = Stream.of(br.readLine().split(" "))
                  .mapToInt(Integer::parseInt)
                  .boxed()
                  .collect(Collectors.toList());
  
        // Print the above Lisr as created
        System.out.println(arrayList);
    }
}


输出:

从上面的 Linux shell 输出我们可以得出结论,输入如下:

4
5.6
1 2 3 4 5

生成的输出如下:

Integer value: 4
Float value: 5.6
[1, 2, 3, 4, 5]

上面的例子说明了大多数程序员在解决竞争性编程问题时最常用的方法。但是,如果我们可以稍微增强我们的代码以使其更快更可靠呢?

方法二:简单的BufferedReader输入读取

Java.io.BufferedReader 类不提供任何读取原始数据输入的方法。 Java.io.BufferedReader 类从字符输入流中读取文本,缓冲字符以提供字符序列的高效读取。尽管它会抛出一个称为 IOException 的已检查异常。让我们看看如何处理该异常并读取用户的输入。考虑如下自定义输入:



输入:

4
5.6
1 2 3 4 5

例子

Java

// Java Program Illustrating Reading Input
// Using
  
// Importing required classes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
        throws IOException
    {
  
        // Reading input via BufferedReader class
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
  
        // Basic Input Reading
        int a = Integer.parseInt(br.readLine());
        float b = Float.parseFloat(br.readLine());
  
        // Print above input values in console
        System.out.println("Integer value: " + a);
        System.out.println("Float value: " + b);
  
        // Space Separated Input Reading
        int[] arr = new int[5];
        String[] strArr = br.readLine().split(" ");
  
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(strArr[i]);
        }
  
        // Printing the eleemnts in array
        // using toString() method
        System.out.println(Arrays.toString(arr));
    }
}

输出:

Integer value: 4
Float value: 5.6
[1, 2, 3, 4, 5]

上面的示例说明了在解决竞争性编程问题时用于读取数据的另一种常用方法。那么这就够了吗?如果我们可以进一步增强它会怎样?是的。有可能的。敬请关注。

方法 3:通过 Streams 使用 BufferedReader 读取分离数据的增强方式

在前面的例子中,我们看到在读取空格分隔的数据时,我们首先将它存储在一个 String 数组中,然后我们遍历元素,然后使用Java类型转换将其转换为所需的数据类型。一行代码如何使这成为可能?是的。 Java 8 的流库提供了多种功能,使其变得简单和优化。考虑如下自定义输入:

输入:

34 55 78 43 78 43 22
94 67 96 32 79 6 33

例子

Java

// Java Program to Read Separated Data
// Using BufferedReader class voa enhanced for loopd
  
// Importing required classes
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
  
// Main class
class GFG {
  
    // Main driver method
    public static void main(String[] args)
        throws IOException
    {
  
        // Reading input separated by space
        BufferedReader br = new BufferedReader(
            new InputStreamReader(System.in));
  
        // Storing in array
        int[] arr = Stream.of(br.readLine().split(" "))
                        .mapToInt(Integer::parseInt)
                        .toArray();
        System.out.println(Arrays.toString(arr));
  
        // Using streams concepts to parse map to integer
        // later on collecting via Collectors via toList()
        // method and storing it an integer list
        List arrayList
            = Stream.of(br.readLine().split(" "))
                  .mapToInt(Integer::parseInt)
                  .boxed()
                  .collect(Collectors.toList());
  
        // Print the above Lisr as created
        System.out.println(arrayList);
    }
}

输出:

[34, 55, 78, 43, 78, 43, 22]
[94, 67, 96, 32, 79, 6, 33]

上面的例子说明了我们如何使用一行代码读取分离的输入并将其存储到所需的数据结构中。使用 java8,程序员可能对 List 集合感到满意。这就是它被覆盖的原因。现在,让我们逐字理解代码。