Nano Hash - криптовалюты, майнинг, программирование

Группировка и сортировка потока java8 по совокупной сумме

Учитывая класс Java Что-то

class Something {
  private int parentKey;
  private String parentName;
  private int childKey;
  private int noThings;

  public Something(int parentKey, String parentName, int childKey, 
    int noThings) {
    this.parentKey = parentKey;
    this.parentName = parentName;
    this.childKey = childKey;
    this.noThings = noThings;
  }

  public int getParentKey() {
    return this.parentKey;
  }

  public int getNoThings() {
    return this.noThings;
  }
}

У меня есть список объектов

List<Something> somethings = newArrayList(
            new Something(425, "Lemon", 44, 23),
            new Something(123, "Orange", 125, 66),
            new Something(425, "Lemon", 11, 62),
            new Something(123, "Orange", 126, 32),
            new Something(323, "Lime", 25, 101),
            new Something(123, "Orange", 124, 88)
);

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

Так что я в конечном итоге с

List<Something> sortedSomethings = newArrayList(
            new Something(123, "Orange", 124, 88),
            new Something(123, "Orange", 125, 66),
            new Something(123, "Orange", 126, 32),
            new Something(323, "Lime", 25, 101),
            new Something(425, "Lemon", 11, 62),
            new Something(425, "Lemon", 44, 23)
);

Я знаю, что сопоставить его с помощью parentKey и суммы noThings

Map<Integer, Integer> totalNoThings = colns
            .stream()
            .collect(
                    Collectors.groupingBy(
                            Something::getParentKey,
            Collectors.summingInt(ClientCollectionsReceived::getNoThings)));

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

class SomethingWrapper {
  private int totalNoThingsPerClient;
  private Something something;
}

Но кажется, что это много работы и не очень элегантно.

Любые наблюдения/идеи будут с благодарностью оценены.


Ответы:


1

Ну вы уже сделали основную работу по сбору сводной информации

Map<Integer, Integer> totalNoThings = somethings.stream()
    .collect(Collectors.groupingBy(Something::getParentKey,
        Collectors.summingInt(Something::getNoThings)));

тогда все, что вам нужно сделать, это использовать эту информацию в операции сортировки:

List<Something> sorted=somethings.stream().sorted(
    Comparator.comparing((Something x)->totalNoThings.get(x.getParentKey()))
          .thenComparing(Something::getNoThings).reversed())
    .collect(Collectors.toList());
09.06.2015
  • Спасибо! Я как раз собирался опубликовать ответ после небольшой борьбы с кодом! Мое решение было не таким хорошим, как ваше, но следовало той же логике. 10.06.2015

  • 2

    Собственно пришлось сделать один небольшой твик, а не totalNoThings.get, это был totalNothings.indexOf

    Итак, окончательное решение. был

    List<Integer> totalNoThings
        = somethings.stream()
        .collect(Collectors.groupingBy(Something::getParentKey,
                        Collectors.summingInt(Something::getNoThings)))
        .entrySet().stream()
        .sorted(Map.Entry.comparingByValue())
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
    
    
    List<Something> sorted 
        = somethings.stream().sorted(
                Comparator.comparing(
                (Something obj)->totalNoThings.indexOf(
                obj.getParentKey()))
        .thenComparing(Something::getNoThings).reversed())
                .collect(Collectors.toList());
    
    10.06.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..