2010-10-21 3 views
3

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

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

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

+2

Ручной петли. Привет, это Java. – 2010-10-21 18:47:04

ответ

6

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

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

+0

Всегда на шаг впереди! +1. –

+0

Кажется хорошей альтернативой, чтобы использовать Multimap. Если вас беспокоит зависимость, код из hvgotcodes будет также действительной и простой альтернативой. – cuh

1

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

+0

Даунсайд, вы заканчиваете итерацию по тем же элементам, по крайней мере, 'm' раз, где' m' - количество уникальных идентификаторов родителей. –

+0

@Mark Правда, но вы не теряете пространства, если хотите только обрабатывать элементы, а не отдельные отдельные списки. Я не совсем уверен, чего хочет этот вопросчик. – Jonathan

3

Создать петлю

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 

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

+0

Это хорошая альтернатива отсутствию Гуавы. –

+0

Это не совсем типичная идиома ... вы можете просто создать и добавить список, если вы получите нуль, а затем добавите элемент. Тогда вам нужно добавить элемент только в одном месте, а не в два. – ColinD

+0

@colinD, абсолютно правильно; исправлено... – hvgotcodes

0

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

В частности, использовать 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 
Смежные вопросы