我用
读了一行BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
reader.readLine();
示例输入
1 4 6 32 5
读取输入并将其放入整数数组int[]
的最快方法是什么?
如果可能,我也在寻找一些单行解决方案。
答案 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}}方法。
<强> 释 强>
Scanner
的{{1}}方法并扫描整个字符串。readLine()
BufferedReader
上述方法经过测试可以解析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编程对空格进行整数输入,并在我加了数字的情况下执行您选择的任何任务。