如何从 Java 8 中的字符串数组创建 BigDecimal 流?
How to create BigDecimal stream from String array in Java 8?
我的任务是对作为字符串数组给出的 BigDecimals 进行排序。我的想法是使用BigDecimal的String参数构造函数,然后排序,然后用forEach打印出来。这是代码部分:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n + 2];
for (int i = 0; i < n; i++) {
s[i] = sc.next();
}
Stream.of(s)
.map(i -> new BigDecimal(i))
.sorted((bg1, bg2) -> bg1.compareTo(bg2))
.forEach(System.out::println); //line 22
但是我得到了 forEach 行的 NullPointerException:
Exception in thread "main" java.lang.NullPointerException
at java.math.BigDecimal.<init>(BigDecimal.java:806)
at Solution.lambda$main(Solution.java:20)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at Solution.main(Solution.java:22)
我期待听到流专家的声音。
谢谢!
您已将 s
数组声明为 n + 2
个元素,但您只填充了第一个 n
。因此,当流到达最后两个元素时,您会失败,因为 BigDecimal
不接受 null
作为构造函数参数。
您可以创建仅包含 n
个元素 (new String[n]
) 的数组,或者仅使用流式传输前 n
个元素:
Arrays.stream(s, 0, n)
您还可以将流简化为:
Arrays.stream(s, 0, n)
.map(BigDecimal::new)
.sorted()
.forEachOrdered(System.out::println);
请注意,如果您想确保输出是有序的,您应该真正使用 forEachOrdered
。
我的任务是对作为字符串数组给出的 BigDecimals 进行排序。我的想法是使用BigDecimal的String参数构造函数,然后排序,然后用forEach打印出来。这是代码部分:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String[] s = new String[n + 2];
for (int i = 0; i < n; i++) {
s[i] = sc.next();
}
Stream.of(s)
.map(i -> new BigDecimal(i))
.sorted((bg1, bg2) -> bg1.compareTo(bg2))
.forEach(System.out::println); //line 22
但是我得到了 forEach 行的 NullPointerException:
Exception in thread "main" java.lang.NullPointerException
at java.math.BigDecimal.<init>(BigDecimal.java:806)
at Solution.lambda$main(Solution.java:20)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at Solution.main(Solution.java:22)
我期待听到流专家的声音。
谢谢!
您已将 s
数组声明为 n + 2
个元素,但您只填充了第一个 n
。因此,当流到达最后两个元素时,您会失败,因为 BigDecimal
不接受 null
作为构造函数参数。
您可以创建仅包含 n
个元素 (new String[n]
) 的数组,或者仅使用流式传输前 n
个元素:
Arrays.stream(s, 0, n)
您还可以将流简化为:
Arrays.stream(s, 0, n)
.map(BigDecimal::new)
.sorted()
.forEachOrdered(System.out::println);
请注意,如果您想确保输出是有序的,您应该真正使用 forEachOrdered
。