这通常是我接受用户Array
的方式。我要求大小,然后循环并填充Array
。
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int[] numbers = new int[N];
for (int n=0; n<N; n++){
numbers[n] = scan.nextInt();
}
我一直在努力学习java 8,我注意到Random
类现在有一个创建流的方法。现在很容易用随机数声明一个n大小的数组。
int[] randomNumbers = new Random().ints().limit(N).toArray();
我一直在尝试创建一个数组,使用stream或lambda表达式执行类似的操作,但是用户输入。我尝试做的是创建IntStream
,将值映射到Scanner#nextInt
,然后创建一个数组。
int[] numbers = new IntStream().map(x -> scan.nextInt()).limit(N).toArray();
我可以做的事情是这样的:
int[] numbers = new int[N];
Arrays.fill(numbers, 0);
numbers = Arrays.stream(numbers).map(x -> scan.nextInt()).toArray();
System.out.println(Arrays.toString(numbers));
但这仍然有点多余。用一些任意数字填充数组只是为了在下一行中替换它。
答案 0 :(得分:3)
int[] numbers = IntStream.generate(() -> scan.nextInt()).limit(N).toArray();
如评论中所提到的,这会生成无序流。如果您想订购,可以使用:
IntStream.range(0, N).map(i -> scan.nextInt()).toArray();
答案 1 :(得分:3)
由于way, the current implementation handles limit(…)
s,使用以下方法创建流更有效:
IntStream.range(0, N).map(i -> scan.nextInt())
使用toArray()
以及并行处理时效率更高,尽管使用range
操作创建了一个未使用的值。此外,这会创建一个ordered stream maintains the element order。
所以在使用时,
int[] numbers = IntStream.range(0, N).map(i -> scan.nextInt()).toArray();
它可以提前了解数组大小。