Преобразование списка <Object>в карту <ключ, список <Object>> с использованием атрибута объекта в качестве ключа - PullRequest
0 голосов
/ 17 июня 2019

У меня есть объект Foo со следующими элементами:

class Foo {
    int id;
    int departmentId;
    boolean condition1;
    boolean condition2;
    boolean condition3;
    //...
}

и список объектов Foo (~ 10 тыс. Записей):

List<Foo> fooList = new ArrayList<>();
fooList.add(...);
//...

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

Для этой цели я думал просто создать новую Карту, в которой мой идентификатор отдела будет использоваться в качестве ключа, а все связанные объекты Foo - в качестве значения. Чтобы я мог выполнять итерацию по моим новым объектам на основе DepartmentId и легко останавливать итерацию для других отделов с таким же Id после выполнения условия. Что-то вроде:

Map<Foo.departmentId, List<Foo>> departmentFoos = new HashMap<>();

Может ли это быть достигнуто лучше, чем итерация по моему fooList и помещение / замена объекта моего HashMap по одному?

Ответы [ 2 ]

3 голосов
/ 17 июня 2019

Так что с точки зрения количества итераций маловероятно, что преобразование в Map принесет вам какую-либо выгоду, вам лучше просто просмотреть список и обработать его на месте. Это необходимо, потому что невозможно узнать, достигли ли вы последнего появления определенного отдела, пока не пройдете весь список Foo с.

Так что я бы сделал что-то вроде:

for (Foo foo : fooList) {
  if (hasBeenProcessed(foo.departmentId) {
    continue;
  }
  process(foo);
}

Обратите внимание, что hasBeenProcessed может быть простым processedDepartmentIds.contains(foo.departmentId) в зависимости от ваших потребностей.

Для простого преобразования его в карту нет ничего, что могло бы избежать прохождения по всему списку. Для этого есть удобные методы в таких библиотеках, как Guava: Maps.toMap или Guava: Multimaps.index .

2 голосов
/ 17 июня 2019

Используя потоки, это можно сделать следующим образом:

Map<Integer, List<Foo>> output = fooList.stream()
                .collect(Collectors.groupingBy(Foo::getDepartmentId, Collectors.toList()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...