Группировать список объектов на основе заполненных атрибутов - PullRequest
1 голос
/ 18 июня 2019

У меня есть класс с 10 атрибутами.Я хочу сгруппировать список объектов этого класса на основе заполненных атрибутов или нет.Именно я получу 2 ^ n групп.Я могу перебрать список и написать 2 ^ n условий и сгруппировать их в новые списки.Существуют ли другие лучшие способы реализации этой функциональности вместо записи условий переключения?

Ответы [ 3 ]

0 голосов
/ 18 июня 2019

Вы можете добавить метод в интересующий вас класс, который возвращает BitSet с каждым установленным битом или нет, в зависимости от того, инициализировано ли соответствующее поле:

public class DemoClass {
    public BitSet getInitializationStatus() { ... }

Тогда вы можете просто использовать эти наборы битов в качестве ключей на карте от набора битов до списка:

public HashMap<BitSet, List<DemoClass>> buildGroups(List<DemoClass> demoClasses)
{
    HashMap<BitSet, List<DemoClass>> groups = new HashMap<>();
    for( DemoClass demoClass : demoClasses )
    {
        List<DemoClass> group = groups.getOrDefault(demoClass.getInitializationStatus(), 
                new ArrayList<>());
        group.add(demoClass);
        groups.put(demoClass.getInitializationStatus(), group);
    }
    return groups;
}
0 голосов
/ 18 июня 2019

В итоге я получил битовое значение атрибутов Записи (1 и 0 для каждого атрибута (1 означает, что значение существует, а 0 означает, что оно не существует)) в строке и сгруппировано по ним по строке.

records.stream().map(record -> new ExportDto.Builder().buildUpon(record).bitValue(getBitValueOfExportRecord(record)).build())
.collect(Collectors.groupingBy(ExportDto::getBitValue))
0 голосов
/ 18 июня 2019

Вы можете избежать написания нескольких операторов switch и иметь идентификатор / ключ в самом классе, который помогает понять, установлены ли определенные свойства.

Пример:

DemoClass (3 атрибута для упрощения)

public class DemoClass {
    public String property1 = null;
    public String property2 = null;
    public String property3 = null;

    public String getKey() {
        StringBuilder sb = new StringBuilder();
        sb.append(this.property1 != null ? "PROPERTY1" : "").append("|");
        sb.append(this.property2 != null ? "PROPERTY2" : "").append("|");
        sb.append(this.property3 != null ? "PROPERTY3" : "").append("|");

        return sb.toString();
    }
}

Над полями можно заполнить различными способами, такими как overloaded constructors или setter методы.

Теперь, когда вы хотите разделить на группы, вы можете использовать HashMap и добавлять объекты класса в список на основе значения их ключей, как показано ниже

Map<String, List<DemoClass>> map = new HashMap<>();
for (DemoClass demoClass : demoClasses) {
    map.computeIfAbsent(demoClass.getKey(), k -> new ArrayList<>()).add(demoClass);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...