Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Брать данные из коллекции порциями / 14 сообщений из 14, страница 1 из 1
03.02.2020, 22:56
    #39922075
iv_roman_vl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
Всем привет!
Есть коллекция ArrayList<Person>.
Person состоит из полей name и isWorked(boolean).
В коллекции, например, тысяча Person(ов). У всех свойство isWorked = false.

Как взять первые 100 Person(ов), установить им признак isWorked = true.
Потом остальные сто и тд до последнего?

Спасибо!
...
Рейтинг: 0 / 0
03.02.2020, 23:20
    #39922081
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
iv_roman_vl
Всем привет!
Есть коллекция ArrayList<Person>.
Person состоит из полей name и isWorked(boolean).
В коллекции, например, тысяча Person(ов). У всех свойство isWorked = false.

Как взять первые 100 Person(ов), установить им признак isWorked = true.
Потом остальные сто и тд до последнего?

Спасибо!


Что значит взять? Они и так уже в памяти если у вас есть ArrayList. Еще раз попробуйте сформулировать проблему
...
Рейтинг: 0 / 0
04.02.2020, 02:54
    #39922095
Victor Nevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
iv_roman_vl, ну и зачем вам java?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
--drop table if exists person;
--create table person (id serial, pers_name varchar, worked bool not null default false);
--insert into person (pers_name)
--                   (select cast((random()*10000) as varchar)
--                      from generate_series(1, 100000, 1) as f );
update person
   set worked = true
 where id in (select id from person where worked = false limit 100);

select 'is idle',count(*) 
  from person where worked = true
 union all
 select 'not idle', count(*) 
  from person where worked = false

update, можно выполнять много раз или в цикл поставить, while (true).

exp1 exp2is idle100not idle99900
...
Рейтинг: 0 / 0
04.02.2020, 03:02
    #39922096
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
Victor Nevsky
iv_roman_vl, ну и зачем вам java?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
--drop table if exists person;
--create table person (id serial, pers_name varchar, worked bool not null default false);
--insert into person (pers_name)
--                   (select cast((random()*10000) as varchar)
--                      from generate_series(1, 100000, 1) as f );
update person
   set worked = true
 where id in (select id from person where worked = false limit 100);

select 'is idle',count(*) 
  from person where worked = true
 union all
 select 'not idle', count(*) 
  from person where worked = false

update, можно выполнять много раз или в цикл поставить, while (true).

exp1 exp2is idle100not idle99900


Все правильно, если исключить вопрос - а почему сразу все не проапдейтить?
...
Рейтинг: 0 / 0
04.02.2020, 03:21
    #39922097
Victor Nevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
забыл ник , так не интересно, нужно еще коллекцию, каким-то макаром, обновить
while (true) {...
...}
...
Рейтинг: 0 / 0
04.02.2020, 11:42
    #39922189
asv79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
iv_roman_vl
Всем привет!
Есть коллекция ArrayList<Person>.
Person состоит из полей name и isWorked(boolean).
В коллекции, например, тысяча Person(ов). У всех свойство isWorked = false.

Как взять первые 100 Person(ов), установить им признак isWorked = true.
Потом остальные сто и тд до последнего?

Спасибо!


а что тут сложного то ?
класс Pesron
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(fluent = true)
public class Person {
    private String name;
    private boolean isWorked;
}




Main класс

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
import java.util.List;

public class Main {
    private static List<Person> personList;

    public static void main(String[] args) {

        for (int i = 0; i < 1000; i++) {
            personList.add(new Person());
        }

        for (int x = 0; x < personList.size(); x++) {
            if (!personList.get(x).isWorked()) {
                for (int i = x; i < x + 100; i++) {
                    personList.get(i).isWorked(true);
                }

            }
        }
    }
}
...
Рейтинг: 0 / 0
04.02.2020, 11:48
    #39922190
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
Victor Nevsky,
А где тут субд в вопросе?
...
Рейтинг: 0 / 0
04.02.2020, 14:21
    #39922293
Герой дня
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
Можешь разделить на потоки для ускорения, сам ArrayList лежит в памяти

Код: java
1.
2.
3.
ArrayList<Person> persons = new ArrayList<>();

persons.stream().parallel().forEach(p -> p.setIsWorked(true));
...
Рейтинг: 0 / 0
04.02.2020, 14:31
    #39922301
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
Потоки, что бы одно поле установить?
Жестоко

p.s.
даже просто итерация по стримам может быть на __порядки__ медленнее, чем итерация по массиву AFAIK, а тут еще и потоки
медленнее, за счет того, что очень легко пролюбить RangeCheckElimination
...
Рейтинг: 0 / 0
04.02.2020, 14:46
    #39922313
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
iv_roman_vl
Как взять первые 100 Person(ов), установить им признак isWorked = true.
то есть твой код взял первые 100 и забыл об этом? Флаг зачем ставить?
))))
...
Рейтинг: 0 / 0
04.02.2020, 16:32
    #39922379
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
iv_roman_vl
Всем привет!
Есть коллекция ArrayList<Person>.
Person состоит из полей name и isWorked(boolean).
В коллекции, например, тысяча Person(ов). У всех свойство isWorked = false.

Как взять первые 100 Person(ов), установить им признак isWorked = true.
Потом остальные сто и тд до последнего?

Спасибо!

Похоже автор еще ни разу не ответил. Чтож. Значит многие ответы - равновероятно стрельнули мимо.

Налицо какой-то code-smell или антипаттерн разработки мультипоточки. Для начала эту задачу
надо попробовать решить малой кровью.

Я думаю что нам хватит 1 пременной типа AtomicInteger.

И мы ей будем делать +100, +100 e.t.c. Если стоит задача отслеживания пачки.

Если пачка может быть обработана неудачно - то можно убрать счетчик и заменить его
коллекцией пачек.

Код: java
1.
List<PersonBatch> personBatch =



1 пачка == 100 персон. Ну и признак isWorked должен быть атомарным.

Думаю на этом пока хватит.

Подождем автора.
...
Рейтинг: 0 / 0
04.02.2020, 21:58
    #39922520
iOracleDev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
mayton,

Глянул на темы автора топика, там Oracle и APEX, может автор думает, что массив это таблица СУБД ... ))
...
Рейтинг: 0 / 0
05.02.2020, 01:23
    #39922561
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
Мда... Apex это что-то очень старое и ненужное.
...
Рейтинг: 0 / 0
05.02.2020, 07:38
    #39922595
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Брать данные из коллекции порциями
mayton
Мда... Apex это что-то очень старое и ненужное.
в столице, в одном из министерств работает нормально.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Брать данные из коллекции порциями / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]