Инициализация 2D ArrayList для суммирования для цикла (Java) - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь суммировать N пар целых чисел - Nx2 ArrayList - и вернуть N суммирования в виде ArrayList. Хотя я понимаю, что для этого не нужно создавать класс, я хотел бы сделать это в качестве практики для будущих проектов.

import java.util.ArrayList;

public class SumsInLoop {
    public SumsInLoop(int numberOfPairs, ArrayList<ArrayList<Integer>> numbersList) {}

    public ArrayList<Integer> getSums(int numberOfPairs, ArrayList<ArrayList<Integer>> numbersList) {
        ArrayList<Integer> pairsOfSums = new ArrayList<Integer>();
        for (ArrayList<Integer> Pair : numbersList) {
            int x = Pair.get(0);
            int y = Pair.get(1);
            int sum = x + y;
            pairsOfSums.add(sum);
        }
        System.out.println(pairsOfSums);
        return pairsOfSums;
    }

Данные, которые мне дают, представляют собой случайный ассортимент из N пар (numbersOfPairs) целых чисел, например, 612673 108695. Я хотел бы добавить эти пары целых чисел в 2D ArrayList (numbersList), который будет вызываться getSums.

Однако у меня возникают трудности при инициализации числового списка. Моя основная функция заключается в следующем:

    public static void main(String[] args) {
        int myNumberOfPairs = 13;
        ArrayList[][] myNumbersList = new ArrayList[13][2];
        myNumbersList[0][0] = new ArrayList<>();
        myNumbersList[0][0].add(612673);
        myNumbersList[0][1].add(108695);
        myNumbersList[1][0] = new ArrayList<>();
        myNumbersList[1][0].add(756875);
        myNumbersList[1][1].add(496058);
        SumsInLoop mySum = new SumsInLoop(myNumberOfPairs,myNumbersList);
        mySum.getSums(myNumberOfPairs, myNumbersList);

Последние две строки кода выдают ошибки, прося меня изменить myNumbersList на тип ArrayList<List<Integer>>, который генерирует еще больше ошибок, даже после изменения всех 2D ArrayList на тип ArrayList<List<Integer>>.

Итак, два моих вопроса таковы:

  1. Как я могу инициализировать NxM ArrayList и правильно его заполнить?
  2. Есть ли более быстрый способ выполнить эту задачу, все еще используя метод класса?

P.S. Я привык к программированию на Python и сам обучаю себя Java, поэтому любая другая информация или ресурсы, которые вы можете мне предоставить, очень ценятся.

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Поскольку вы уже знаете количество значений в паре, ArrayList не требуется. Вы можете создать свою собственную, более простую реализацию пары.

class Pair {
    public final int left;
    public final int right;

    public Pair(int left, int right){
        this.left = left;
        this.right = right;
    }
}

Затем вы можете получить доступ к значениям, создав объект пары и получив доступ к его полям.

Pair p = new Pair(10, 7);
System.out.println(p.left); // 10
System.out.println(p.right); // 7

Теперь вы можете более просто переопределить свой getSums метод.

public static List<Integer> getSums(List<Pair> pairs){
    List<Integer> pairsOfSums = new ArrayList<>();
    for(Pair pair : pairs){
        int sum = pair.left + pair.right;
        pairsOfSums.add(sum);
    }
    return pairsOfSums;
}

Пожалуйста, обратите внимание, что функция может быть static, и вам не нужно передавать количество пар. Цикл for-each будет циклически проходить через все из них, независимо от того,


Тогда инициализация массива проще, чем метод, который вы описали в вопросе.

List<Pair> pairs = new ArrayList<>();
pairs.add(new Pair(7, 10));
pairs.add(new Pair(18, 3));
pairs.add(new Pair(-6, 0));
pairs.add(new Pair(4, 2));
System.out.println(SumsInLoop.getSums(pairs));
0 голосов
/ 05 мая 2018

Вы можете упростить ввод, используя двумерный массив int: int[][] myNumbersList = new int[13][2];
Ожидаемый результат в этом случае представляет собой одномерный массив int[13], который можно получить следующим образом (продемонстрировано с 2 парами. См. mcve ):

public class SumsInLoop {
    //pairsOfInts should be an [n][2] array
    private static int[] sumOfPairs(int[][] pairsOfInts) {

        int[] sums = new int[pairsOfInts.length];
        for(int pairIndex = 0; pairIndex < pairsOfInts.length; pairIndex++) {
            sums[pairIndex]= pairsOfInts[pairIndex][0]+pairsOfInts[pairIndex][1];
        }
        return sums;
    }

    public static void main(String[] args) {
        int numberOfPairs = 2;
        int[][] pairsOfInts = new int[numberOfPairs][2];
        pairsOfInts[0] = new int[] {612673,108695 };
        pairsOfInts[1] = new int[] {756875,496058 };
        int[] sumOfPairs = sumOfPairs(pairsOfInts);
        System.out.println(Arrays.toString(sumOfPairs));
    }
}

Если вам нужно решение, реализованное с помощью List, вы можете использовать javafx Pair (или создать свой собственный класс пары.
Ввод может быть определен как List<Pair<Integer,Integer>> pairsOfInts = new ArrayList<>();
Выходной результат может быть массивом, как указано выше, или List<Integer>:

import java.util.ArrayList;
import java.util.List;
import javafx.util.Pair;

public class SumsInLoop {

    private static List<Integer> sumOfPairs(List<Pair<Integer, Integer>> pairsOfInts) {
        List<Integer> sums = new ArrayList<>();
        for(Pair<Integer,Integer> pair : pairsOfInts) {
            sums.add(pair.getKey()+ pair.getValue());
        }
        return sums;
    }

    public static void main(String[] args) {
        List<Pair<Integer,Integer>> pairsOfInts = new ArrayList<>();
        pairsOfInts.add (new Pair<>(612673,108695 ));
        pairsOfInts.add (new Pair<>(756875,496058));
        List<Integer> sumOfPairs = sumOfPairs(pairsOfInts);
        System.out.println(sumOfPairs); 
    }
}
0 голосов
/ 05 мая 2018

Исключение (компиляции), которое вы получаете, связано с тем, что вы ожидаете ArrayList<ArrayList<Integer>>, но передаете ArrayList[][]. (что не совпадает в Java)

  1. В вашем случае вам потребуется (в методе main):

    ArrayList<ArrayList<Integer>> myNumbersList = new ArrayList</* when java > 6 ;)*/>(13);
    

    это только устанавливает емкость (родительского) списка (..и основного / внутреннего вспомогательного массива) чтобы инициализировать дочерние списки, вы не будете зацикливаться (как-то ... даже не в python:):

    for (int i = 0; i < 13; i++) {
        myNumbersList.add(new ArrayList<Integer>(2));
    }
    

    Зависит от того, что означает «правильно» ... но я предполагаю, что со «случайными данными», в идеале, вы бы снова использовали внутренний цикл:

    java.util.Random rnd = new Random(/*seed default current timestamp*/);
    //...
    for (int i = 0; i < 13; i++) {
      ArrayList<Integer> innerList = new ArrayList<>(2);
      for (int j = 0; j < 2; j++) {
        innerList.add(rnd.netxInt(/*bound default Integer.MAX_VALUE*/) /*+/-/% offset*/);
      }
      myNumberList.add(innerList);
    }
    
  2. Извините, я не знаю одного (более быстрого способа), но многое зависит от "формата ввода".

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