Массив чисел в одно число через Stream

136
17 апреля 2021, 13:00

Дано - входящий массив; из которого нужно убрать все дубликаты и вернуть число, состоящее из оставшихся чисел массива. Реализовать нужно через Stream. Пример - вошел массив {1, 2, 3, 2, 2, 3} - вернулось число 123.

Текущая реализация:

private static int minValue(int[] array) {
    int[] noDuplicates = IntStream.of(array).distinct().toArray();
    int result = 0;
    for (int i = noDuplicates.length - 1, n = 0; i >= 0; --i, n++) {
        int pos = (int) Math.pow(10, i);
        result += noDuplicates[n] * pos;
    }
    return result;
}

Но нужно реализовать через один лишь Stream, без использования циклов. Точнее, используя терминальные операции, которые сводят stream чисел в одно число по заданному алгоритму. Прошу подсказать, как это реализовать

Answer 1

Как-то так?

Arrays.asList(1, 2, 3, 2, 2, 3).stream().distinct().map(Object::toString).collect(Collectors.joining()); // вернёт 123

Если результат нужен именно как int:

int res = Integer.valueOf(Arrays.asList(1, 2, 3, 2, 2, 3).stream().distinct().map(Object::toString).collect(Collectors.joining()));

Если без строк, то можно как-то так:

int res = Arrays.asList(1, 2, 3, 2, 2, 3)
    .stream()
    .distinct()
    .reduce(0, (a,b) -> (a + b * (int)(a == 0 ? 1 :Math.pow(10, (int) (Math.log10(a) + 1))))); 

Только на выходе будет 321. Остаётся только перевернуть.

Answer 2
int result = Stream.of(1, 2, 3, 2, 2, 3)
        .distinct()
        .reduce(0, (a,b) -> 10 * a + b);

Результат: 123.

Но это только для чисел меньших 10-ти, для чисел больших 10-ти немного сложнее:

int result = Stream.of(1, 123, 2, 3, 22, 2, 2, 3, 22, 10)
        .distinct()
        .reduce(0, (a,b) -> (int)Math.pow(10, (int)(Math.log10(b) + 1)) * a + b);

Результат: 1123232210.

READ ALSO
Присвоение значения с TextField в String

Присвоение значения с TextField в String

Не понимаю, как присвоить значение String c TextField

103
Функция TestRestTemplate.withBasicAuth() не работает

Функция TestRestTemplate.withBasicAuth() не работает

Функция TestRestTemplatewithBasicAuth() не работает В настройках доступ ко всем ендпоинтам открыт

81
Как запретить нажатие клавиши Enter для кнопки?

Как запретить нажатие клавиши Enter для кнопки?

У меня есть некий "Кликер Монет"Но если нажать один раз на кнопку, то в будущем можно будет просто зажать клавишу Enter и счётчик монет будет...

89
Как отследить DevTools состояние?

Как отследить DevTools состояние?

Возможно ли по средствам JavaScript отследить что пользователь зашел на старицу с уже открытой панелью разработчика DevTools ? (не только для Chrome но и для...

80