2015-01-26 3 views
0

Я ищу хороший способ группировать список объектов по нескольким атрибутам класса. Google guava library предоставляет функцию группировки по одному атрибуту. Я еще не нашел утилиту, которая предлагает то, что я ищу.Группируйте список объектов по нескольким атрибутам

См. Ниже. Я инкапсулировал атрибуты группировки в свой класс Grouping. Однако это не обязательно, если существует лучшее решение.

Класс, который содержит группирующие атрибуты.

Class Grouping{ 

private String key1; 
private String key2; 
private String key3; 

//getters, setters 

} 

Класс, представляющий тип, который необходимо сгруппировать.

Class Groupable{ 

private Grouping grouping; 

private String x; 
private String y; 
private String z; 

// getters, setters 

} 

Что мне нужно, это карта, содержащая в качестве ключа, объект Groupable с уникальным набором ключей. И список объектов Groupable как соответствующие сгруппированные элементы.

Map<Grouping, List<Groupable>> groupings; 

Любые предложения приветствуются!

+0

Метод, с которым вы связываетесь, выполняет именно то, что вы хотите: вы передаете функцию, которая преобразует Groupable в Grouping, и делает все остальное. Конечно, для Grouping необходимо правильно реализовать hashCode() и equals(). В чем проблема? Обратите внимание, что это довольно легко сделать с простой картой. –

+0

Хорошо. Я думаю, мне нужно реализовать свои собственные equals(). Это то, чего мне не хватает, поскольку реализация по умолчанию ищет равенство объектов, в то время как я хочу установить равенство в атрибутах объектов. Благодарю. – Angad

+0

Не забудьте реализовать 'hashCode()', который соответствует вашему 'equals()'. –

ответ

0

Ответ на мой вопрос, основанный на комментариях @JBNizet и @ JohnBollinger.

Я использую Eclipse IDE, поэтому все, что мне нужно сделать, это перейти в Source -> 'Generate hashCode() и equals() ..' и вызвать тот же мой класс Grouping, чтобы включить все атрибуты в переопределенную реализацию , Там на, библиотека гуавы можно использовать в обычном порядке, как показано ниже:

Function<Groupable, Grouping> groupFunction = new Function<Groupable, Grouping>(){ 

    @Override 
    public Grouping apply(Groupable groupable) { 

     return groupable.getGrouping(); 
    } 

}; 

ImmutableListMultimap<Grouping, Groupable> groupings = Multimaps.index(lsGroupable, groupFunction); 

groupings дает мне то, что мне нужно. lsGroupable - это список Groupable объектов.

Смежные вопросы