получить счет после использования условия groupingBy для нескольких полей - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу получить число userId после использования условия groupingBy для нескольких полей

моего класса модели.

public class ModelClass{
int bussAssId;
int trackingId;
int userId;
int month;
String day;
int hour;
String deviceType ;

//Setter and Getters
} 

в классе обслуживания с использованием JpaRepositroy Я получаю Список данных.Здесь usedId может быть таким же, но trackingId будет уникальным.

List<ModelClass> sqlModelList=postgreSQLRepository.findByBussAssId(bussAssId);

здесь я хочу использовать условие groupingBy для месяца, дня, часа, deviceType и получить счетчик userId.

similer для:

select month,day,hour,device_type,PPC_TYPE,click_source,count(user_id) from ne_tracking_info group by month,day,hour,device_type;

Я использовал следующий код для группировки, но не понимал, как сортировать.

Map<Integer,Map<String,Map<Integer,Map<String,List<PostgreSQLModel>>>>> device=sqlModelList.stream().collect(Collectors.groupingBy(p->p.getMonth(),Collectors.groupingBy(p->p.getDay(),Collectors.groupingBy(p->p.getHour(),Collectors.groupingBy(p->p.getPrimaryKeys().getDeviceType())))));

вывод должен быть таким, как показано ниже:

output exampe

1 Ответ

0 голосов
/ 25 апреля 2019

Сначала необходимо сгруппировать данные и затем отсортировать их:

List<GroupModelClass> devices = sqlModelList.stream()
        .collect(Collectors.groupingBy(GroupModelClass::new, Collectors.counting()))
        .entrySet().stream()
        .map(e -> e.getKey().setCount(e.getValue()))
        .sorted(Comparator.comparingLong(GroupModelClass::getCount).reversed())
        .collect(Collectors.toList());

После первого сбора (grouping) значение счетчика добавляется к объектам, объекты сортируются и собираются вlist.

Используется пользовательский объект для представления сгруппированных данных:

public static class GroupModelClass {
    private int month;
    private String day;
    private int hour;
    private String deviceType;
    private long count;

    public GroupModelClass(ModelClass model) {
        this.month = model.getMonth();
        this.day = model.getDay();
        this.hour = model.getHour();
        this.deviceType = model.getDeviceType();
    }

    public GroupModelClass setCount(long count) {
        this.count = count;
        return this;
    }

    // getter

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        GroupModelClass that = (GroupModelClass) o;
        return month == that.month &&
                hour == that.hour &&
                count == that.count &&
                Objects.equals(day, that.day) &&
                Objects.equals(deviceType, that.deviceType);
    }
}

Результатом будет список groupModels, отсортированный по убыванию по количеству.

...