将用空格分隔的整数读入int []数组

时间:2013-01-31 21:04:52

标签: java arrays int inputstream

我用

读了一行
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();

示例输入

1 4 6 32 5

读取输入并将其放入整数数组int[]的最快方法是什么?

如果可能,我也在寻找一些单行解决方案。

11 个答案:

答案 0 :(得分:24)

您可以使用Scanner

Scanner scanner = new Scanner(System.in);
List<Integer> list = new ArrayList<Integer>();
while (scanner.hasNextInt())
  list.add(scanner.nextInt());
int[] arr = list.toArray(new int[0]);

直到我们在java中有闭包,这可能是你能得到的最短的。

int[] arr = list.toArray(new int[0]);将无效,因为没有从Integer到int的转换。您不能将int用作泛型的类型参数。

但是是的如果您正在使用Java 8,那么您可以使用以下代码片段来实现Stream API(更好的做事方式)。

int[] array = list.stream().mapToInt(i->i).toArray();

答案 1 :(得分:14)

简短回答

BufferedReader比扫描仪更快

使用BufferedReader然后拆分和解析每个Integer值要快得多,然后使用nextInt()的{​​{1}}方法。

<强>

  1. 使用Scanner的{​​{1}}方法并扫描整个字符串。
  2. 将此字符串拆分为readLine()
  3. 迭代上面的数组并使用BufferedReader
  4. 解析每个整数值

    上述方法经过测试可以解析1000个不同的整数,并且使用str.split("\\s")Integer.parseInt()方法的速度提高了两倍。

    测试BufferedReader类的代码

    nextInt()

    用于测试Scanner的nextInt()

    的代码
    Scanner

    输入

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    class BufferedReaderTest
    {
        public static void main(String[] args) throws IOException {
            BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
    
            int num[] = new int[1000];
            String[] strNums;
            long startTime, endTime;
    
    
            /*________ TEST STARTS ________*/
            startTime = System.nanoTime();
            strNums = bi.readLine().split("\\s");
            for(int i=0; i<strNums.length; i++) {
                num[i] = Integer.parseInt(strNums[i]);
            }
            endTime = System.nanoTime();
            /*________ TEST ENDS ________*/
    
            System.out.println("Total Time Taken: " + (endTime - startTime));
        }
    }
    

    以下是这些代码针对1000种不同输入进行测试的结果

    import java.util.Scanner;
    import java.io.IOException;
    
    class ScannerTest
    {
        public static void main(String[] args) throws IOException {
            Scanner sc = new Scanner(System.in);
            int[] nums = new int[1000];
            int i=0;
            long startTime, endTime;
    
            /*________ TEST STARTS ________*/
            startTime = System.nanoTime();
            while(sc.hasNext())
                nums[i++] = sc.nextInt();
            endTime = System.nanoTime();
            /*________ TEST ENDS ________*/
    
            System.out.println("Total Time Taken: " + (endTime - startTime));
            for(i=0; i<nums.length; i++) {
                System.out.print(nums[i] + " ");
            }
        }
    }
    

答案 2 :(得分:8)

嗯,使用Java 8 Streams,实际上可以在一行中完成:

int[] array = Arrays.stream(reader.readLine().split("\\s")).mapToInt(Integer::parseInt).toArray();

其中reader是您的BufferedReader对象。

<强>解释

  • reader.readLine()将输入读作String
  • reader.readLine().split("\\s")String拆分为返回String[]的白色空格
  • Arrays.stream(reader.readLine().split("\\s"))Stream
  • 创建String[]
  • Arrays.stream(reader.readLine().split("\\s")).mapToInt(Integer::parseInt)Integer::parseInt应用于Stream的每个元素,并返回由应用函数的结果组成的IntStream
  • Arrays.stream(reader.readLine().split("\\s")).mapToInt(Integer::parseInt).toArray()会返回包含int[]
  • 元素的IntStream

答案 3 :(得分:2)

由于您不知道输入的大小,您可以将输入读取为字符串,然后将字符串数组解析为整数数组

String[] arr=reader.readLine().split(" ");
int[] intarr=new int[arr.length];

for(int i=0;i<arr.length;i++)
 intarr[i]=Integer.parseInt(arr[i]);

答案 4 :(得分:1)

尝试

 line = reader.readLine();
 String[] s = line.split(" ");
 ...

你也可以看看StringTokenizer,但其中最快的一个是读取字节并迭代它们并自己转换ascii(utf8?)编码的数字;)

答案 5 :(得分:1)

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String [] s = reader.readLine().split(" ");
int []i= new  int[s.length];
for(int k =0;k<s.length;k++){
    i[k]= Integer.parseInt(s[k]);
 }

答案 6 :(得分:1)

只需实现名为FastReader的这个类,如下所示:

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;
    }
}

现在将通过空格分隔的整数读取到int []数组中,如下所示:

FastReader fr = new FastReader();
int size = fr.nextInt();
int arr[] = new int[size];
for(int i=0; i<size; i++)
    arr[i] = fr.nextInt();

答案 7 :(得分:0)

您也可以预编译正则表达式Pattern以分割字符串。

    Pattern pattern = Pattern.compile("(\\d+)\\s+"); //$NON-NLS-1$
    Matcher matcher = pattern.matcher(line);
    List<Integer> numbers = new LinkedList<Integer>();

    while (matcher.find()) {
        numbers.add(Integer.valueOf(matcher.group(1)));
    }
    Integer[] output = numbers.toArray(new Integer[numbers.size()]);

或者您也可以直接使用pattern.split

    Pattern pattern = Pattern.compile("(\\d+)"); //$NON-NLS-1$
    String[] numberAsString = pattern.split(line);
    int[] numbers = new int[numberAsString.length];
    for (int i = 0; i < numberAsString.length; i++) {
        numbers[i] = Integer.valueOf(numberAsString[i]).intValue();
    }

得爱正则表达式:D

答案 8 :(得分:0)

简单的答案将使用扫描器类的for方法在nextInt()循环内读取整数。

这里是实现:

import java.util.Scanner;

public class DriverMain {
    public static void main(String args[]){
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("Enter the size of an array: ");
        int size = scanner.nextInt();

        System.out.println("Enter array elements separated by single space.");
        int[] numbers = new int[size];
        for(int i=0;i<size;i++){
            numbers[i] =  scanner.nextInt();
        }

        for(int i=0;i<size;i++){
            System.out.println(numbers[i]);
        }

    }
}

答案 9 :(得分:0)

使用拆分方法:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String input[];
int arr[];
input = reader.readLine().split("\\s");
for (int i = 0; i < input.length; i++) {
    arr[i] = Integer.parseInt(input[i]);
}

答案 10 :(得分:-1)

 Scanner sc = new Scanner(System.in);
    String n=sc.nextLine();
    String[] no=n.split(" ");
    int sum=0;
    for(String i:no){
        sum+=Integer.parseInt(i);}
    System.out.println(sum);

上面的代码是如何使用Java编程对空格进行整数输入,并在我加了数字的情况下执行您选择的任何任务。