Как я могу нарезать свой список на куски, прежде чем я вызову метод для каждого из чанка? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть List объектов в Java:

ArrayList<myObj> objs = generateObjs();

, и у меня есть метод, отвечающий за дальнейшую отправку объектов, этот метод принимает приведенный выше список в качестве аргумента:

sendObjectsFurther(objs)

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

Каков наилучший подход для этого?

Я думал о реализации чего-то вроде этого:

public void sendSliced(List objs) {

    ArrayList<myObj> tempList = new ArrayList()<>;
    for (int i = 0; i < objs.size(); i++) {
        tempList.add(objs.get(i));
        if (i % 5 == 0) {
            sendObjectsFurther(tempList);
            tempList.clear();
        }         
    }
}

, но я думаю, что это не охватит все крайние случаи, не могли бы вы помочь мне с этим? Спасибо!

Ответы [ 4 ]

0 голосов
/ 25 февраля 2020

Вы можете добавить одну строку к вашему коду

public void sendSliced(List objs) {

    ArrayList<myObj> tempList = new ArrayList()<>;
    for (int i = 0; i < objs.size(); i++) {
        tempList.add(objs.get(i));
        if (i % 5 == 0) {
            sendObjectsFurther(tempList);
            tempList.clear();
        }         
    }
    sendObjectsFurther(tempList);
}

, которая добавит оставшиеся элементы.

0 голосов
/ 25 февраля 2020

Вы можете использовать guava Lists.partition, который будет разбит на подсписки. Пример:

for (List<String> slice : Lists.partition(bigList, 5)) {
    send(slice);
}

Соответствующая javado c ссылка https://guava.dev/releases/23.0/api/docs/com/google/common/collect/Lists.html#partition - java .util.List-int-

0 голосов
/ 25 февраля 2020

Пожалуйста, проверьте код ниже, здесь каждый подсписок будет представлять чанк с 5 элементами, поэтому предположим, что в моем списке obj всего 8 элементов, поэтому первый чанк будет иметь 5, а следующий чанк будет иметь 3.

public static void main(String[] args) throws IOException {
            List<Employee> objs = new ArrayList<>();
            objs.add(new Employee(1));
            objs.add(new Employee(2));
            objs.add(new Employee(3));
            objs.add(new Employee(4));
            objs.add(new Employee(5));
            objs.add(new Employee(6));
            objs.add(new Employee(7));
            objs.add(new Employee(8));
            sendSliced(objs);
        }

        private static void sendSliced(List<Employee> objs) {
            int chunkSize = 5;
            final AtomicInteger counter = new AtomicInteger();
            Collection<List<Employee>> subLists = objs.stream()
                    .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
                    .values();
            subLists.stream().forEach( sublist -> System.out.print(sublist));
            subLists.stream().forEach( sublist -> sendObjectsFurther(sublist));
        }
}


class Employee {
   private int id;
   Employee(int id) {
    this.id = id;
   }    
}

Ouput будет что-то вроде:

index = 0
[com.practice.stackoverflow.Employee@77459877, com.practice.stackoverflow.Employee@5b2133b1, com.practice.stackoverflow.Employee@72ea2f77, com.practice.stackoverflow.Employee@33c7353a, com.practice.stackoverflow.Employee@681a9515]
index=1
[com.practice.stackoverflow.Employee@3af49f1c, com.practice.stackoverflow.Employee@19469ea2, com.practice.stackoverflow.Employee@13221655]  
0 голосов
/ 25 февраля 2020

Для этого вы можете использовать Java 8 Stream API .

List<myObj> objs = generateObjs();
int chunkSize = 5;
AtomicInteger counter = new AtomicInteger();

Collection<List<myObj>> result = objs.stream()
    .collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize))
    .values();
for (myObj chunk: result){
    sendObjectsFurther(tempList);
}

Кроме того, имена классов должны начинаться с верхнего регистра.

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