Сбор значения массива int с использованием обычного потока JAVA - PullRequest
6 голосов
/ 24 марта 2019

В моей программе я пытаюсь распечатать отсортированный массив int с использованием потока.Но я получаю ложный вывод при использовании обычного потока.И при использовании int stream выводятся правильные данные.

Для получения более подробной информации см. Ниже фрагмент ядра.

package com.test.sort.bubblesort;

import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class BubbleSortWithRecursion {

    public static void bubbleSort(int[] arr, int n) {

        if (n < 2) {
            return;
        }

        int prevValue;
        int nextValue;
        for (int index = 0; index < n-1; index++) {
            prevValue = arr[index];
            nextValue = arr[index+1];

            if  (prevValue > nextValue) {
                arr[index] = nextValue;
                arr[index+1] = prevValue;
            }
        }

        bubbleSort(arr, n-1);
    }

    public static void main(String[] args) {
        int arr[] = new int[] {10,1,56,8,78,0,12};
        bubbleSort(arr, arr.length);

        **//False Output** :  [I@776ec8df
        String output = Arrays.asList(arr)
            .stream()
            .map(x -> String.valueOf(x))
            .collect(Collectors.joining(","));

        System.out.println(output);

        //Correct Output : 0,1,8,10,12,56,78
        String output2 = IntStream
            .of(arr)
            .boxed()
            .map(x -> Integer.toString(x))
            .collect(Collectors.joining(","));

        System.out.println(output2);

    }


}

И я получаю следующий вывод на консоли:

[I@776ec8df
0,1,8,10,12,56,78

Первая строка вывода была сгенерирована с использованием обычного потока Java, что неверно.

Почему я получаю ложное содержимое с использованием обычного потока JAVA?Я что-то здесь упускаю?

Ответы [ 3 ]

8 голосов
/ 24 марта 2019

Вы можете решить свою проблему следующим образом:

String output = Arrays.stream(arr)
        .boxed()
        .map(String::valueOf)
        .collect(Collectors.joining(",")); // 0,1,8,10,12,56,78

Объясните, что произойдет:

при использовании Arrays.asList(), который выглядит так:

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

потребовалосьvarargs типа T, в вашем случае вы используете его для int[] Object, поэтому Arrays.asList() вернет List из int[], а не поток целых чисел, поэтому вместо этого вы должны использовать Arrays.stream, который выглядиткак это:

public static IntStream stream(int[] array) {
    return stream(array, 0, array.length);
}

, чтобы получить правильные данные.

7 голосов
/ 24 марта 2019

Arrays.asList(arr) возвращает List<int[]>, единственным элементом которого является arr.Поэтому потоковая передача этого List и последующее сопоставление этого отдельного элемента с String.valueOf(x) и сбор с помощью Collectors.joining(",") приведут к String, значением которого является toString() этого единственного массива, то есть вывод, который вы видите.

String output = Arrays.asList(arr) // List<int[]>
    .stream() // Stream<int[]>
    .map(x -> String.valueOf(x)) // Stream<String> having a single element - "[I@776ec8df"
    .collect(Collectors.joining(",")); // "[I@776ec8df"

Когда вы создаете IntStream из массива int, вы получаете поток отдельных элементов (значения int), поэтому вы можете их упаковать, затем преобразовать в String s и присоединитьсячтобы получить желаемый результат.

Вы можете заставить свой первый фрагмент работать, если вы измените:

int arr[] = new int[] {10,1,56,8,78,0,12};

на:

Integer arr[] = new Integer[] {10,1,56,8,78,0,12};

с тех пор Arrays.asList(arr)создаст List<Integer>, содержащий все элементы входного массива.

0 голосов
/ 24 марта 2019

Вы можете сделать это даже немного короче:

String output = Arrays.stream(arr)
        .mapToObj(String::valueOf)
        .collect(Collectors.joining(","));

Результат - 0,1,8,10,12,56,78

Сначала вы создаете IntStream, затем вы получаете Stream<String>, чтособрал в финал String.

...