получить список с максимальной и минимальной суммой из (вложенного списка) списка с использованием Java 8 - PullRequest
2 голосов
/ 12 мая 2019

Я проверял этот вопрос, но он не отвечает на мой вопрос

Как получить минимальное и максимальное значение из Списка объектов с использованием Java 8 Найти максимум, минимум, сумму исреднее значение списка в Java 8

Моя проблема У меня есть вложенный список List, и я хочу получить один список.

У меня есть этот класс:

public class Competitor {
  private final int type;
  private final String name;
  private final int power;

  public Competitor(int type, String name, int power) {
    this.type = type;
    this.name = name;
    this.power = power;
  }

  public int getType() {
    return type;
  }

  public String getName() {
    return name;
  }

  public int getPower() {
    return power;
  }

  @Override
  public String toString() {
    return "Competitor{" + "type=" + type + ", name=" + name + ", power=" + power + "} ";
  }

}

Теперь у меня есть List<List<Competitor>> как:

List<List<Competitor>> anotherListOfListCompetitor = new ArrayList<>();
anotherListOfListCompetitor.add(new ArrayList<>(
    Arrays.asList(new Competitor(1, "Cat 00", 93), new Competitor(2, "Dog 18", 40), new Competitor(3, "Pig 90", 90)))); //93 + 40 + 90 = 223

anotherListOfListCompetitor.add(new ArrayList<>(
    Arrays.asList(new Competitor(1, "Cat 23", 20), new Competitor(2, "Dog 30", 68), new Competitor(3, "Pig 78", 32)))); //20 + 68 + 32 = 120

anotherListOfListCompetitor.add(new ArrayList<>(
    Arrays.asList(new Competitor(1, "Cat 10", 11), new Competitor(4, "Cow 99", 90)))); //11 + 90 = 101

Теперь я хочу получить List<Competitor> с минимальной суммой power Свойство и другие List<Competitor> с максимальной суммой.

Я знаю о сокращении ...

List<Competitor> someListCompetitor = //populate the list

int sumPower = someListCompetitor.stream()
    .map(competitor -> competitor.getPower())
    .reduce(0, (a, b) -> a + b);

Но возможно ли для List<List<Competitor>> получение minListCompetitor с минимальным sumPower и anotherListCompetitor с максимальным sumPower?

List<Competitor> minListCompetitor = anotherListOfListCompetitor
    .stream()... // wich sum power is 101


List<Competitor> maxListCompetitor = anotherListOfListCompetitor
    .stream()... // wich sum power is 223

Как получить эти списки?

1 Ответ

1 голос
/ 12 мая 2019

Вы можете использовать это:

List<Competitor> minListCompetitor = anotherListOfListCompetitor.stream()
        .min(Comparator.comparingInt(l -> l.stream().mapToInt(Competitor::getPower).sum()))
        .orElse(Collections.emptyList());

List<Competitor> maxListCompetitor = anotherListOfListCompetitor.stream()
        .max(Comparator.comparingInt(l -> l.stream().mapToInt(Competitor::getPower).sum()))
        .orElse(Collections.emptyList());

Возвращает .min() / .max() суммы из списков. Для расчета суммы используется упрощенная версия кода, предоставленного вами.

Если вы хотите создать исключение, если максимум не найден, вы можете использовать .orElseThrow().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...