Эффективный способ разделить список на списки размера n - PullRequest
50 голосов
/ 29 апреля 2011

У меня есть массив, который я хочу разделить на меньшие массивы n размера и выполнить операцию над каждым из них.Мой текущий способ сделать это

реализован с помощью ArrayLists в Java (подойдет любой псевдокод)

    for (int i = 1; i <= Math.floor((A.size() / n)); i++) {
            ArrayList temp = subArray(A, ((i * n) - n),
                    (i * n) - 1);
            // do stuff with temp
        }

    private ArrayList<Comparable> subArray(ArrayList A, int start,
                int end) {
            ArrayList toReturn = new ArrayList();
            for (int i = start; i <= end; i++) {
                toReturn.add(A.get(i));
            }
            return toReturn;
        }

где A - список, n - размер желаемых списков

Я полагаю, что этот способ занимает слишком много времени при работе со значительно большими списками (размером до 1 миллиона), поэтому я пытаюсь выяснить, что будет более эффективным.

Ответы [ 13 ]

0 голосов
/ 08 июня 2018

Поскольку вы хотите оптимизировать производительность, вы должны использовать параллельный поток вместо цикла for.Таким образом, вы можете использовать несколько потоков.

Lists.partition(A, n).parallelStream().forEach({
    //do stuff with temp
});

Вы также можете использовать другие способы сортировки с потоком, например, сбор или отображение, если это соответствует вашей цели.

0 голосов
/ 29 апреля 2011

А как же

Arrays.copyOfRange( original, from, to )

0 голосов
/ 29 апреля 2011

Если вы работаете с массивами, вы можете использовать для этого System.arraycopy () .

 int[] a = {1,2,3,4,5};

 int[] b = new int[2];
 int[] c = new int[3];

 System.arraycopy(a, 0, b, 0, 2); // b will be {1,2}
 System.arraycopy(a, 2, c, 0, 3); // c will be {3,4,5}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...