Java фолд-аррайлисты

1

] [0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0]

0, 0, 0, 0, 0, 0, 0,

+ [0, 0, 0, 1, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 0]

+ [0, 1, 0, 0, 0, 0, 1, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0]

= [0, 2, 0, 0, 1, 0, 0, 1, 0, 0, -3, -3, 0, 0, 1, 0, 1, 0, 0, 0]

Есть ли функция Java для выполнения вышеуказанной задачи или мне нужно перебирать все списки? Мой самый маленький список - около 3 тыс. Элементов, а средний - около 20 тыс.

  • 2
    Возможно, вам придется перебирать списки. Если есть такая функция, она будет делать то же самое. Если у вас разные длины массива, то у вас могут возникнуть проблемы в любом случае / вам придется создать логику, соответствующую вашим целям (добавьте только первые 3 КБ (минимальная длина) для элементов 20 КБ, т. Е.)
  • 1
    Если вы можете использовать Java8, возможно, стоит взглянуть на потоки ; особенно использование параллельных потоков.
Теги:
arraylist
fold

2 ответа

1
Лучший ответ

вам понадобится как минимум 1 for цикла, используя его индекс по всем массивам, в качестве result[i]=arr[i]+arr2[i]+....+arrn[i];

Если длина каждой переменной изменяется в каждом массиве, сначала вам нужно проверить, что вы находитесь в ее границах, прежде чем пытаться получить доступ к элементу.

  • 0
    Да, но это, вероятно, будет лучше оптимизировано. Тогда я сделаю по-старому. Благодарю.
  • 1
    Может быть, это можно оптимизировать, но для хорошего доступа к данным, вы должны получить доступ к данным. Вы не можете избежать прохождения всех элементов, если вы должны обработать все из них. Даже если есть более «красивый» способ сделать это, внутренне он должен получить доступ ко всем соответствующим данным.
Показать ещё 2 комментария
1

Способ сделать это - использовать потоки Java 8. Я думаю, что функция reduce() эквивалентна F # fold(). Например:

public static void main(String[] args) {
    List<List<Integer>> lists = new ArrayList<>();
    lists.add(Arrays.asList(0, 1, 0, 0, 0, 0, 0, 1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0));
    lists.add(Arrays.asList(0, 0, 0,-1, 1, 0, 0, 0, 0, 0, 0,-1, 0, 0, 1, 0, 0, 0, 0, 0));
    lists.add(Arrays.asList(0, 0, 0, 1, 0, 0, 0,-1, 0, 0,-1, 0, 0, 0, 0, 0, 1, 0, 0, 0));
    lists.add(Arrays.asList(0, 1, 0, 0, 0, 0, 0, 1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0));

    int n = lists.get(0).size();
    // Reduce each column to the sum of the elements in the column
    // For example:
    //     i = 0 -> 0 + 0 + 0 + 0 = 0
    //     i = 1 -> 1 + 0 + 0 + 1 = 2
    IntUnaryOperator sumElementsInPosition = i -> lists.stream()
                                                       .map(l -> l.get(i))
                                                       .reduce(0, (a, b) -> a + b);

    // For each position i, map the position to the sum of elements in that position
    List<Integer> sum = IntStream.range(0, n)
                                 .map(sumElementsInPosition)
                                 .boxed()
                                 .collect(Collectors.toList());

    System.out.println(sum);
}

Вывод:

[0, 2, 0, 0, 1, 0, 0, 1, 0, 0, -3, -3, 0, 0, 1, 0, 1, 0, 0, 0]
  • 0
    (F # имеет как сгиб, так и уменьшение) Так что уменьшение существует! Я просто не ожидал, что это будет в 8. Спасибо за это. Я создам новую версию моего кастом редуктора с J8.
  • 0
    Да, map() , reduce() , filter() , Lambdas и куча других функциональных функций были введены в Java 8: docs.oracle.com/javase/8/docs/api/java/util/stream/Stream. HTML

Ещё вопросы

Сообщество Overcoder
Наверх
Меню