Java - Как отделить список на основе свойства его элементов - PullRequest
3 голосов
/ 21 октября 2010

У меня есть список объектов, с которыми я хочу выполнить операцию. Однако сначала мне нужно разделить список на отдельные списки, чтобы все элементы с одинаковым parentID находились в одном и том же списке, а затем операция выполняется для каждого списка отдельно (причина в том, что операция принимает parentID объектов как параметр).

Каков наилучший способ разделения списка на основе заданного свойства его элементов, как требуется здесь? Наибольшее количество объектов, которые будут переданы в исходном списке, составляет <10000 и обычно составляет <1000. </p>

Вся помощь очень ценится!

Ответы [ 4 ]

6 голосов
/ 21 октября 2010

Звучит так, как будто вы хотите использовать Multimaps.index из Гуава .Это создаст вам мультикарту, где каждый ключ имеет коллекцию элементов.

keyFunction, переданный в index, будет Function, который просто извлекает свойство из одного элемента.

3 голосов
/ 21 октября 2010

Создайте цикл

 Map <IdType, List<YourObject>> map

по списку, и для каждого идентификатора сделайте что-то вроде

List theList = map.get(id);
if (theList == null ) {
   // create a new list, add it to the map under the id

}  

// add the item to theList

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

1 голос
/ 21 октября 2010

Я бы порекомендовал написать Iterator, который обертывает Iterator, возвращая только те элементы, которые соответствуют вашему желанию. Затем вы можете написать реализацию Iterable, которая принимает Iterable, возвращая такой итератор (это позволит вам использовать расширенный цикл for).

0 голосов
/ 21 октября 2010

Если вы можете добавить стороннюю библиотеку, Google Guava предоставляет различные утилиты, которые могут вам помочь.

В частности, используйте Collections2.transform как это:

Collection myOriginalList;
Collection mySplitList1 = Collections2.transform(myOriginalList, new Function() { /* method to filter out parent ID 1 */ });
... // repeat for each parent id you're interested in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...