Функция диапазона Python для значений Double в Java 8 с использованием потоков - PullRequest
0 голосов
/ 01 декабря 2018

Я хотел создать массив парных символов в Java, содержащий значения в диапазоне от 0 до 100 с шагом 0,1

В Python можно было бы использовать функцию диапазона: range(0, 100, 0.1)

InJava 8, это будет работать:

Double[] x = DoubleStream.iterate(0.1, i -> i + 0.1).limit(1000).boxed().toArray(Double[]::new);

Что-нибудь попроще, что я мог бы использовать?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Когда вы говорите "Есть ли что-нибудь попроще, что я мог бы использовать?"Я бы предположил, что «проще» в данном случае означает «более короткий» код.

При использовании потокового API нет ничего, что могло бы сделать ваш текущий код «короче».Вероятно, объясняет, почему Java не является одним из лучших языков для игры в гольф, но ... он выполняет свою работу.

Я могу констатировать очевидное, но одну вещь, которую вы всегда можете сделать, это рефакторинг / скрытие вашей текущей логики в вспомогательный метод range(p1, p2, p3), тогда вам больше никогда не придется ее видеть, если вы не хотитеи может просто вызвать range(...).

С другой стороны, хороший крик, сделанный @ rgettman с точки зрения «округления с плавающей точкой», так что примите это во внимание.

0 голосов
/ 01 декабря 2018

Ваше решение работает, но оно страдает от округления с плавающей точкой при последовательных вычислениях.

[0,1, 0,2, 0,30000000000000004, 0,4, 0,5, 0,6, 0,7, 0,7999999999999999, 0,899999999999999999, 0.9999999999999999, 1.0999999999999999,

Похоже, что DoubleStream не имеет range метода, но IntStream, rangeClosed, но вы неt контролировать приращение.(Также существует range, но конечный параметр не включен в диапазон.)

Возвращает последовательный порядок IntStream от startInclusive (включительно) до endInclusive (включительно)с шагом 1. 1. 1020 *

Вы можете обойти кумулятивные ошибки округления с плавающей запятой, передавая потоковые значения int с, затем делив на 10.0, чтобы получить приращения 0.1,Кроме того, как уже отмечалось, проще иметь массив примитивов double[], чтобы избежать упаковки и дополнительного использования памяти.

double[] y = IntStream.rangeClosed(0, 1000)
    .mapToDouble(i -> i / 10.0)
    .toArray();

[0,0, 0,1, 0,2, 0,3, 0,4, 0,5, 0,6, 0,7, 0,8, 0,9, 1,0, 1,1, 1,2, 1,3, 1,4, 1,5, 1,6, 1,7, 1,8, 1,9, 2,0, 2,1, 2,2, 2,3, 2,4, 2,5,

Конечно, всегда есть базовый цикл for, который для меня выглядит довольно простым.

double[] z = new double[1001];
for (int i = 0; i < z.length; i++) { z[i] = i / 10.0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...