Извлечь упорядоченный (в соответствии со значением) Набор из вложенного списка на основе последнего элемента списка, Java - PullRequest
4 голосов
/ 18 мая 2019

Я задаю этот вопрос Список только одного значения фильтрованного списка

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>> nestedCompetitor = new ArrayList<>(); 

List<Competitor> listCompetitors0 = new ArrayList<>();

listCompetitors0.add(new Competitor(1, "Cat 00", 93));
listCompetitors0.add(new Competitor(1, "Cat 10", 11));
listCompetitors0.add(new Competitor(1, "Cat 23", 20));

List<Competitor> listCompetitors1 = new ArrayList<>();
listCompetitors1.add(new Competitor(2, "Dog 61", 54));
listCompetitors1.add(new Competitor(2, "Dog 18", 40));
listCompetitors1.add(new Competitor(2, "Dog 45", 71));
listCompetitors1.add(new Competitor(2, "Dog 30", 68));

List<Competitor> listCompetitors2 = new ArrayList<>();
listCompetitors2.add(new Competitor(3, "Pig 90", 90));
listCompetitors2.add(new Competitor(3, "Pig 78", 20));

List<Competitor> listCompetitors3 = new ArrayList<>();
listCompetitors3.add(new Competitor(4, "Cow 99", 90));

nestedCompetitor.add(listCompetitors0);
nestedCompetitor.add(listCompetitors1);
nestedCompetitor.add(listCompetitors2);
nestedCompetitor.add(listCompetitors3);

Теперь мне нужно извлечь Набор, взяв последний элемент каждого Списка, содержащийся в nestedCompetitor

List<Competitor> listLastCompetitor = new ArrayList<>();
nestedCompetitor.stream()
    .forEachOrdered(listCompetitor -> {
      Competitor lastCompetitor = listCompetitor.stream().reduce((first, second) -> second).orElse(null);
      listLastCompetitor.add(lastCompetitor);
    });
List<Integer> listLastPower = new ArrayList<>(listLastCompetitor.stream()
    .map(Competitor::getPower)
    .collect(Collectors.toSet()));

EDIT

Set<Integer> setLastSampleRateFinal = nestedNodeResample.stream()
    .map(l -> l.get(l.size() - 1).getSampleRateTarget()) 
    .collect(Collectors.toSet()).stream().sorted().collect(Collectors.toSet());

// Я добавляю это .stream().sorted().collect(Collectors.toSet()) не работает

List<Integer> list = new ArrayList<>(setLastSampleRateFinal);
Collections.sort(list, Collections.reverseOrder());
Set<Integer>  orderedSetLastSampleRateFinal = new LinkedHashSet<>(list);

Как оптимизировать предыдущий код (если это возможно)?

Для проверки вывода

System.out.println("\nlistLastPower:");
listLastPower.stream().forEach(System.out::print);

1 Ответ

3 голосов
/ 18 мая 2019

Вместо того, чтобы получить промежуточные результаты, вы можете сделать это за один раз.Вот как это выглядит.

Set<Integer> listLastPower = nestedCompetitor.stream()
    .map(l -> l.get(l.size() - 1).getPower())
    .collect(Collectors.toSet());

Если вы хотите отсортировать это в порядке убывания, вы должны использовать встроенный Comparator, как показано ниже.Обратите внимание на использование ссылки на конструктор LinkedHashSet, которая учитывает встречающийся порядок.

Set<Integer> listLastPower = nestedCompetitor.stream()
    .map(l -> l.get(l.size() - 1).getPower())
    .sorted(Comparator.reverseOrder())
    .collect(Collectors.toCollection(LinkedHashSet::new));
...