Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/34: Рейтинг темы: голосов - 34, средняя оценка - 4.74
2 / 1 / 1
Регистрация: 24.04.2010
Сообщений: 76

Разбить массив строк на части используя stream

27.03.2019, 14:38. Показов 7162. Ответов 6

Студворк — интернет-сервис помощи студентам
Есть стрим строк, который я получаю после чтения файла:
Java
1
Stream<String> lines = Files.lines(pathFile);
Строк около миллиона. Нужно пройтись по этому стриму, сформировать во время прохода ArrayList и тут же его отправить на обработку. Возможно ли так сделать? Что-то вроде такого:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void myTest() {
    Stream<String> lines = Stream.of(
            "some row from my file 1",
            "some row from my file 2",
            "some row from my file 3",
            "some row from my file 4",
            "some row from my file 5",
            "some row from my file n",
            "some row from my file 750000"
    );
    lines.parallel()
            .unordered()
            .collect(Collectors.partitioningBy(s -> s == 3).supplier(it -> {
                myParser(it);
            }));
}
 
public void myParser(List<String> myList){
    System.out.println(myList.size()); // split by 3 lines 
}
Кто-нибудь делал нечто подобное?

Добавлено через 57 минут
Ну , сделаю так, пожалуй

Java
1
2
3
4
5
6
7
8
9
        ArrayList<String> list = new ArrayList<>();
 
        lines.forEach(it -> {
            list.add(it);
            if (list.size() > 0 && list.size() % 3 == 0) {
                myParser(list);
                list.clear();
            }
        });
Хотелось покрасивше
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2019, 14:38
Ответы с готовыми решениями:

Разбить массив на 4 части по диагонали и посчитать сумму в каждой части
Двумерный массив. Разбить массив на 4 части по диагонали и посчитать сумму в каждой части. Помогите пожалуйста

Нахождение строк максимальной длины, используя Stream
Здравствуйте. Прошу помочь с решением следующей задачи: Допустим, как-то задан поток Stream&lt;String&gt; stream = ... Можно...

Как разбить TStringList на части по 15 строк?
Как разбить TStringList на части по 15 строк? Вот так вот вроде пашет но оно показывает только по 1 строке в ShowMessage... а мне надо...

6
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.03.2019, 14:55
чо ты сделать то вообще хочешь?
0
2 / 1 / 1
Регистрация: 24.04.2010
Сообщений: 76
27.03.2019, 15:58  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
чо ты сделать то вообще хочешь?
Разбить стрим строк на отдельные массивы и каждый массив отправить на обработку (в метод myParser) , желательно продолжая разбивать дальше

Добавлено через 1 минуту
вот ещё 1 вариант предложили как это сделать:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class T30SplitStream {
 
public static void main(String[] args) {
    Stream<String> lines = Stream.of("some row from my file 1", "some row from my file 2",
            "some row from my file 3", "some row from my file 4", "some row from my file 5",
            "some row from my file n", "some row from my file 750000");
    AtomicInteger i = new AtomicInteger(0);
    Map<Integer, List<String>> map = lines.parallel().unordered().map(s -> new Pair(i.incrementAndGet(), s))
            .collect(Collectors.groupingBy(p -> p.i % 3, Collectors.mapping(p -> p.s, Collectors.toList())));
    System.out.println(map);
 
}
 
public static class Pair {
    public final Integer i;
    public final String s;
 
    public Pair(int i, String s) {
        this.i = i;
        this.s = s;
    }
}
}
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
27.03.2019, 15:59
Цитата Сообщение от maksimka2112 Посмотреть сообщение
сформировать во время прохода ArrayList и тут же его отправить на обработку.
а почему бы не отправлять на обработку не весь лист, а обрабатывать по записям?
мне казалось, что стримы для того и задумывались что бы обрабатывать по мере поступления
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.03.2019, 17:12
Цитата Сообщение от maksimka2112 Посмотреть сообщение
Stream<String> lines = Stream.of("some row from my file 1", "some row from my file 2",
* * * * * * "some row from my file 3", "some row from my file 4", "some row from my file 5",
* * * * * * "some row from my file n", "some row from my file 750000");
* * AtomicInteger i = new AtomicInteger(0);
* * Map<Integer, List<String>> map = lines.parallel().unordered().map(s -> new Pair(i.incrementAndGet(), s))
* * * * * * .collect(Collectors.groupingBy(p -> p.i % 3, Collectors.mapping(p -> p.s, Collectors.toList())));
* * System.out.println(map);
давайте возьмем массив из 100500 миллионов строк, и создадим из него еще один массив, в котором будут те же строки, но завернутые в другие массивы по 3
0
2 / 1 / 1
Регистрация: 24.04.2010
Сообщений: 76
27.03.2019, 17:30  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
давайте возьмем массив из 100500 миллионов строк, и создадим из него еще один массив, в котором будут те же строки, но завернутые в другие массивы по 3
Да я вместо тройки потом своё число подставлю - разве в этом суть? Я потом эти мелкие массивы буду батчами сохранять в базу. Точнее не буду, а уже сделал. И работает это раз в 10 быстрее, чем 1 крупный массив.

Добавлено через 4 минуты
Цитата Сообщение от Pablito Посмотреть сообщение
а почему бы не отправлять на обработку не весь лист, а обрабатывать по записям?
мне казалось, что стримы для того и задумывались что бы обрабатывать по мере поступления
ну в итоге я так и сделал. Просто думал, что можно как-то это эффектно средствами стримов сделать, используя partitioning или ещё что. Ладно, вопрос закрыт. Формирую в forEach листы из элементов и отправляю их в парсирующий метод.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
27.03.2019, 17:41
для этого нет нужды создавать новые коллекции, батчи можно прямо из исходной собирать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2019, 17:41
Помогаю со студенческими работами здесь

Как создать картинки используя bitmap.Save(Stream stream, .)
Я сохраняю все картинки так: output = bmp; output.Save($&quot;Img{Convert.ToString(i)}.png&quot;); Это в конце цикла. Но как выяснилось,...

Удалить из Stream-а все вещественные числа, не используя дополнительных Stream-ов
Здравствуйте. Есть следующая задача: В поток записана последовательность целых и вещественных чисел в символьном виде через пробел....

Разбить массив на 2 части
Добрый день! Есть массив, который необходимо разбить на части для того, чтобы между ними вывести DIV с информацией. Первая от второй...

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

Разбить массив на равные части
Пользователь вводит массив целых чисел, состоящий из последовательных групп из 4 чисел. Как можно разбить массив на отдельные массивы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru