как разделить список на 3 списка на основе идентификаторов в java - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть некоторые данные, хранящиеся в списке. Теперь я должен разделить этот список на 3 списка на основе идентификатора.

Может кто-нибудь помочь мне сделать это в java?

У меня есть список вроде [{partyRoleId: 1, partyId: 001, name: keer}, {prtyRoleId: 1, partyId : 002, name: swathi}, {partyRoleId: 1, partyId: 003, name: ashok}, {partyRoleId: 2, partyId: 004, name: nag}, {partyRoleId: 2, partyId: 005, name: meg}, {partyRoleId: 3, partyId: 006, имя: praveen}, {partyRoleId: 3, partyId: 007, name: jay}],

это список, который у меня есть, теперь вы можете заметить, что partyRoleId В отличие от некоторой группы людей, я должен перечислить группу людей, у которых partyRoleId равен 1, один список partyRoleId равен 2 в другом списке, а partyRoleId равен 3 в другом списке .... в основном мне нужно 3 списка из одного списка

Ответы [ 4 ]

1 голос
/ 13 февраля 2020

Unisng Java 8 потоков, это можно легко сделать с помощью чего-то вроде

Map<Integer, Integer> result = list.stream()
                                   .collect(Collectors.groupingBy(i -> i % 3, Function.identity()));

, где i % 3 придется заменить на ваши логики c для извлечения и группировки идентификаторов.

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

Используйте для этого потоковую операцию.

    List<Person> data = Arrays.asList(
            new Person(1, "001", "keer"),
            new Person(1, "002", "swath"),
            new Person(1, "003", "ashok"),
            new Person(2, "004", "nag"),
            new Person(2, "005", "meg"),
            new Person(3, "006", "praveen"),
            new Person(3, "007", "jay"));

    Map<Integer, List<Person>> threeLists
            = data.stream().collect(Collectors.groupingBy(Person::getPartyRoleId));

Теперь у нас есть карта из трех списков. Мы можем взять каждый отдельный список следующим образом:

    List<Person> personsWithPartyRoleId1 = threeLists.get(1);
    System.out.println("Persons with partyRoleId 1: " + personsWithPartyRoleId1);
Persons with partyRoleId 1: [{ 1, 001, keer }, { 1, 002, swath }, { 1, 003, ashok }]

Аналогично для двух других списков, конечно. Или мы можем перебрать все три списка на карте:

    threeLists.forEach((pri, list) -> System.out.println(
            "Persons with partyRoleId " + pri + ": " + list));
Persons with partyRoleId 1: [{ 1, 001, keer }, { 1, 002, swath }, { 1, 003, ashok }]
Persons with partyRoleId 2: [{ 2, 004, nag }, { 2, 005, meg }]
Persons with partyRoleId 3: [{ 3, 006, praveen }, { 3, 007, jay }]
0 голосов
/ 13 февраля 2020

С помощью лямбды (стиль Java 8) вы можете достичь этого в одной строке. Допустим, у вас есть список целых чисел. Вы можете создать карту, содержащую три списка, используя следующий

List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
Map<Integer, List<Integer>> lists = ints.stream().collect(Collectors.groupingBy(i -> i%3));

Более интересный и полный пример -

public class Simple {

    static class Person{
        // one can change this to private and create setter/getter
        public int id;
        public String Name;
        public Person(int id, String name) {
            this.id = id;
            Name = name;
        }
        @Override
        public String toString() {
            return "Person{" +
                    "id=" + id +
                    ", Name='" + Name + '\'' +
                    '}';
        }
    }
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(
                new Person(1, "Joe"),
                new Person(2, "Sam"),
                new Person(3, "Jan"),
                new Person(4, "Pat"),
                new Person(5, "Kal"),
                new Person(6, "Gro")
        );

       Map<Integer, List<Person>> lists = persons.stream()
             .collect(Collectors.groupingBy(p -> p.id%3));
        System.out.println("How many lists: "+lists.size());
        lists.entrySet().forEach(es -> {
            System.out.println("Printing values of list: "+es.getKey());
            es.getValue().stream().forEach(System.out::println);
            System.out.println("-------------------");
        });
    }

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

Предполагая, что ваши id s являются целыми числами, вы можете сделать это следующим образом:

for(Data d : fullList){
    switch(d.id % 3){
        case 0:
            list0.add(d);
            break;
         case 1:
            list1.add(d);
            break;
         case 2:
            list2.add(d);
            break; 
    }
}

Если ваши id s имеют какой-либо другой тип, вы можете разделить его на 3 списка аналогично с другими критериями в switch

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