Разделение массива на отдельные массивы, причем каждый третий элемент является первым элементом следующего - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь разбить массивы на отдельные массивы, чтобы получить «ребра». Мне нужно разбить массив на массивы размером 3 с 3-м элементом вновь созданного сплит-массива, являющимся 1-м элементом следующего. Что я сейчас сделал, так это то, что массив успешно разбит на массивы по 3, хотя третий элемент не является первым элементом следующего.

Пример: [1,2,3,4,5,6, 7] должно быть разделено на [1,2,3], [3,4,5], [5,6,7], но я получаю [1,2,3], [4,5 , 6], [7]

Это код, который я использовал:

for(ArrayList<String> path : allPaths) {
    edges = separate(path, 3);
}
for(List<String> edge : edges){
    System.out.println("Edge: "+edge);
}

Затем этот метод доступен

static <T> List<List<T>> separate (List<T> path, final int size){
    List<List<T>> separated = new ArrayList<>();

    for(int i = 0; i < path.size(); i+= size){
        separated.add(new ArrayList<>(path.subList(i, Math.min(path.size(), i + size))));
    }
    return separated;
}

1 Ответ

0 голосов
/ 19 апреля 2020

Сделайте это следующим образом:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);
        System.out.println(separate(list, 3));
    }

    static <T> List<List<T>> separate(List<T> path, final int size) {
        List<List<T>> separated = new ArrayList<>();
        List<T> temp;
        for (int i = 0; i < path.size(); i += size - 1) {
            temp = (List<T>) path.subList(i, Math.min(path.size(), i + size));
            if (temp.size() != 1) {
                separated.add(new ArrayList<T>(temp));
            }
        }
        return separated;
    }
}

Вывод:

[[1, 2, 3], [3, 4, 5], [5, 6, 7], [7, 8, 9]]

Обновление

@ Мистер Мосби - Вы оставили комментарий о дополнительное требование не добавлять подсписок в separated, если в нем только один элемент, и, соответственно, я обновил свой ответ, приведенный выше. На всякий случай, если вам нужно, не добавлять подсписок в separated, если в нем меньше элементов, чем size, ниже приводится решение:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7, 8);
        System.out.println(separate(list, 3));
    }

    static <T> List<List<T>> separate(List<T> path, final int size) {
        List<List<T>> separated = new ArrayList<>();
        List<T> temp;
        for (int i = 0; i < path.size(); i += size - 1) {
            temp = (List<T>) path.subList(i, Math.min(path.size(), i + size));
            if (temp.size() == size) {
                separated.add(new ArrayList<T>(temp));
            }
        }
        return separated;
    }
}

Вывод:

[[1, 2, 3], [3, 4, 5], [5, 6, 7]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...