Отфильтруйте элементы один за другим, используя filter()

Начну со своего вопроса:

У меня есть массив:

int[] arr = { 1,2,3,4,5 };, я хочу сохранить значения в List<Integer> li вот так: 14,13,12,11,10

Как эти ценности попали в Список li вот так??

Наши начальные числа — 1,2 ,3 ,4 и 5. Мы можем вычислить следующие суммы, используя четыре из пяти целых чисел:

  • Если мы суммируем все, кроме 1, наша сумма равна 14.
  • Если мы суммируем все, кроме 2, наша сумма будет 13.
  • Если мы суммируем все, кроме 3, наша сумма равна 12.
  • Если просуммировать все, кроме 4, наша сумма будет 11.
  • Если мы суммируем все, кроме 5, наша сумма равна 10.

Мой подход и мысли:

Я думал, что у меня уже есть int [] arr, поэтому я сделаю это для потоковой передачи, теперь я буду filter выводить каждый элемент один за другим, sum отдыхать в каждой итерации и добавлять это в список li.

List<Integer> li   = IntStream.range(0,1).filter(i-> arr[i] !=i).sum();

^^ Это не сработало, я думаю, могу ли я сделать это, как показано ниже?

IntStream.range(0,1).filter(i-> filter(this is anotherfilter)).sum();

Я не могу этого понять, я хочу решить эту проблему с потоками и java-8.

может ли исходный массив иметь повторяющиеся элементы? что будет вашим выходом для int[] arr = { 1,2,3,4,5 ,6,4,2}; и подумайте, что ваша текущая логика сделает с этим вводом.

Naman 22.05.2019 12:46

@Naman, никаких повторяющихся элементов

Joka Lee 22.05.2019 12:48
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
2
2
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете разбить его на два шага и выполнить операцию как:

int[] arr = { 1,2,3,4,5 };
int total = Arrays.stream(arr).sum(); // total of the array
List<Integer> output = Arrays.stream(arr)
        .mapToObj(integer -> total - integer) // (total - current) value as element
        .collect(Collectors.toList());

что делать mapToObj ?? Я нахожу это сложным, я часто вижу карту, карту и т. д. Любая соответствующая статья, чтобы изучить эту концепцию?

Joka Lee 22.05.2019 12:56

Когда я ввожу ввод 7 ,69, 2 ,221, 8974, первый и последний номера списка равны 299 9266, но они должны быть 299 9271

Joka Lee 22.05.2019 13:15

@JokaLee, так как это IntStream, вы можете поочередно использовать boxed() для преобразования в Stream<Integer>, а затем просто использовать map

Naman 22.05.2019 13:16

@JokaLee вы начинаете с массива int, но хотите List из Integer. Итак, вам нужно либо boxed(), либо mapToObj(…), чтобы добраться из IntStream в Stream<Integer>.

Holger 22.05.2019 13:16

@JokaLee, почему это должно быть 9271, сумма 69, 2 ,221, 8974 будет 9266, разве это не то, что вы хотели?

Naman 22.05.2019 13:18

@JokaLee ваше представление о «первом» и «последнем» кажется неправильным. Это не то же самое, что «самый маленький» и «самый большой», если только вы не отсортируете свой массив.

Holger 22.05.2019 13:21

да, теперь я понял, Хольгер, я искал мин и макс. Спасибо, вы кажется дальновидным +1

Joka Lee 22.05.2019 13:28
IntStream.range(0, arr.length)
             .map(x -> IntStream.of(arr).sum() - arr[x])
             .forEachOrdered(System.out::println);

Или IntStream.of(arr).sum() можно вычислить только один раз как одну переменную.

Есть ли какой-нибудь пост SO, в котором примеры вложены filter() с примером?

Joka Lee 22.05.2019 12:52

@JokaLee извините, я не понимаю. какой у Вас вопрос?

Eugene 22.05.2019 12:53

Я хочу узнать, как мы можем написать фильтр внутри фильтра в сложном сценарии, есть ли какой-либо ответ на stackoverflow с примером? Спасибо, сэр, за все ответы здесь.

Joka Lee 22.05.2019 12:54
    Supplier<IntStream> supplier = () -> IntStream.range(1, 6);
    supplier.get()
             .map(integer -> supplier.get().sum() - integer)
             .forEach(item -> System.out.println(item));

Вместо для каждого вы можете использовать собирать (Коллекторы. в Список ()) для сбора целых чисел в список

Другие вопросы по теме