Как разбить целое число на список многих делителей и его остаток - PullRequest
0 голосов
/ 14 января 2020

Я хочу создать коллекцию (или сразу Stream), которая для данного целого числа создает коллекцию, содержащую n разделителей и остаток. Ниже приведен простой код, который создает это:

int initValue = 151;
int chanckValue = 50;

List<Integer> ints = new ArrayList<>();
int value = initValue;
while (value > chanckValue) {
    ints.add(chanckValue);
    value = value - chanckValue;
}
ints.add(value);

System.out.println(ints);

И вывод:

[50, 50, 50, 1]

Как это можно сделать идеально с Stream? Желательно в компактном виде.

ОБНОВЛЕНИЕ

Это только пример использования. Умножение на второй карте можно заменить любой операцией:

Stream.of(3, 54, 150, 151, 230)
.map(value -> {
    List<Integer> ints = new ArrayList<>();
    while (value > chanckValue) {
        ints.add(chanckValue);
        value = value - chanckValue;
    }
    ints.add(value);
    return ints;
})
.map(l -> l.stream()
        .map(v -> v * v)
        .collect(Collectors.toList())
)
.forEach(System.out::println);

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Суммируйте информацию из комментариев. Как Каяман указал: 151 / 50 = 3 и 151 % 50 = 1 и Хольгер предоставляют пример реализации:

int q = value/chanckValue, r = value%chanckValue;
IntStream is = IntStream.range(0, q).map(x -> chanckValue);
if(r != 0) is = IntStream.concat(is, IntStream.of(r));

Другой подход с List

List<Integer> ints = new ArrayList<>(Collections.nCopies(value / chanckValue, chanckValue));
if (value % chanckValue != 0) ints.add(value % chanckValue);

Или с отложенным созданием ArrayList, если необходимо добавить остаток.

List<Integer> ints = Collections.nCopies(value / chanckValue, chanckValue);
if(value % chanckValue != 0) { 
  ints = new ArrayList<>(ints); 
  ints.add(value % chanckValue); 
}
0 голосов
/ 14 января 2020

вы можете использовать рекурсию с потоком, используя Stream.flatMap и Stream.concat

public static Stream<Integer> chunkval(int val, int chanckValue) {
        if (val > chanckValue)
            return Stream.concat(Stream.of(chanckValue), chunkval(val - chanckValue, chanckValue));
        return Stream.of(val);
    }

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

Stream.of(3, 54, 150, 151, 230).flatMap(v -> chunkval(v,chanckValue)).collect(Collectors.toList()).forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...