Решение двоичного и целочисленного кода через объяснение API потока - PullRequest
0 голосов
/ 23 ноября 2018

При решении ката по кодовым войнам я натолкнулся на однострочное решение проблемы преобразования двоичного числа (в форме списка) в целое число.Я не могу понять решение, в котором люди использовали функцию API Java Reduction Stream. Пожалуйста, помогите мне понять это.

Например: [0, 0, 0, 1] рассматривается как 0001, который является двоичным представлением1.

import java.util.List;

public class BinaryArrayToNumber {

    public static int ConvertBinaryArrayToInt(List<Integer> binary) {
       return binary.stream().reduce((x, y) -> x * 2 + y).get();
 }
}

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Назначение функции приведения состоит в том, чтобы накапливать элементы из потока в единый результат, используя данную формулу.

Этот процесс накопления повторяется для каждого элемента потока.Первоначально 1-й аргумент ("x") принимает 0, а 2-й аргумент ("y") принимает первое значение из потока.Для каждого последующего шага результат предыдущего вычисления будет использоваться в качестве 1-го аргумента, а следующее значение из потока будет использоваться в качестве 2-го аргумента.

Используя процедурное программирование, возвращает двоичный файл.stream (). lower ((x, y) -> x * 2 + y) .get (); в вашем случае будет эквивалентно следующему фрагменту:

int x = 0;
for(int y : binary) {
    x = x * 2 + y;
}
return x;
0 голосов
/ 23 ноября 2018

reduce по существу позволяет "уменьшить" (также известный как кратный , накапливать ) элементы потоков в единственное значение.


Вам не нужно смотреть дальше, чем документация по методу redux , чтобы узнать точные предпринятые шаги:

он дает пример, говорящий, что он эквивалентендо:

boolean foundAny = false;
T result = null;
for (T element : this stream) {
     if (!foundAny) {
         foundAny = true;
         result = element;
     }
     else
         result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty();

, где accumulator - это предоставленная вами функция, т.е. (x, y) -> x * 2 + y

0 голосов
/ 23 ноября 2018

Прежде всего, математика, стоящая за ним, основана на методе, описанном здесь

Работу кода лучше всего понять с помощью примера.Рассмотрим двоичное число 1011 (Десятичное число 11)

  • Операция передается последовательно.Исходя из того, как ведет себя операция сокращения, мы переименуем x в accumulator и y в ele
  • Теперь мы можем математически сформулировать вышеуказанную операцию как

    accumulator = (accumulator*2)+ ele // см. Здесь, почему

  • Позволяет запустить формулу на 1011

  • Потоковая передача начинается с первого элемента, т.е.левая сторона и идет последовательно
  • старт: аккумулятор = 0
  • 1) аккумулятор = (0 * 2) + 1 // первый элемент, аккумулятор = 1
  • 2) аккумулятор= (1 * 2) + 0 // второй элемент, аккумулятор = 2
  • 3) аккумулятор = (2 * 2) + 1 // третий элемент, аккумулятор = 5
  • 4) аккумулятор= (5 * 2) + 1 // последний элемент, аккумулятор = 11

Вы можете расширить это до n двоичных цифр.

Важно отметить, что хотя этохорошо для соревнований по кодированию, это никогда не должно использоваться в приложениях реального мира, поскольку reduce() ожидает ассоциативную операцию и также не дает никаких гарантий выполнения sequentially

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...