2016-05-14 2 views
0

Моя задача - заказать BigDecimals в виде массива String. Моя идея - использовать конструктор параметров String BigDecimal, затем отсортировать его, а затем распечатать с помощью forEach. Это часть кода:Как создать BigDecimal поток из массива String в Java 8?

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 

Но я получил это NullPointerException для Foreach линии:

Exception in thread "main" java.lang.NullPointerException 
    at java.math.BigDecimal.<init>(BigDecimal.java:806) 
    at Solution.lambda$main$1(Solution.java:20) 
    at java.util.stream.ReferencePipeline$3$1.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) 

Я с нетерпением жду, чтобы услышать от эксперта потоков.
Спасибо!

+2

Вы заполняете массив до n-го элемента, но ваш 'String []' имеет размер 'n + 2'. Таким образом, последние два элемента имеют значение по умолчанию «null». Лучше писать 's.length' в качестве предиката в вашем for-loop. – Flown

+0

Спасибо! Также была дана сканирующая часть. И я не знал, как отлаживать потоки, либо ... – monami

ответ

4

Вы указали, что ваш массив 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, если вы хотите быть уверенным, что результат в порядке.

+0

Спасибо, тоже! В основном для привлечения внимания к forEachOrdered. Я ошибочно написал естественный порядок, но мне нужно было его отменить, поэтому я заменил .sorted() на .sorted (Comparator.reverseOrder()) – monami

Смежные вопросы