Количество элементов из списка в соответствии с элементом Set - PullRequest
1 голос
/ 22 мая 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 + "} ";
  }
}

Теперь я создал nestedList моего до класса

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);

Я получил заказ Set объявлениеPower

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

List<Integer> account = new ArrayList<>();
Long iterations = 1L;
for (Integer powerSet: setLastPower) {
    Integer powerCount =
    (int)nestedCompetitor.stream()
        .map(l -> l.get(l.size() - 1).getPower())
            .filter(powerList -> powerList.equals(powerSet)).count();
    account.add(powerCount);
    System.out.println("powerSet:" + powerSet + " -> " + "number items:" + powerCount);
    iterations *=(long)powerCount;
}
System.out.println("iterations:" + iterations);

powerCount - это число элементов .

Теперь Я хочу получить количество элементов из List в соответствии скаждый Set элемент .

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

Но есть лиоптимизированные параметры?

1 Ответ

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

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

Map<Integer,Long> map = nestedCompetitor.stream()
    .collect(Collectors.toMap(
        l -> l.get(l.size() - 1).getPower(), list -> 1L, Long::sum,
        () -> new TreeMap<>(Comparator.<Integer>reverseOrder())));

map.forEach((powerSet,powerCount) ->
    System.out.println("powerSet:" + powerSet + " -> " + "powerCount:" + powerCount));

Long iterations = map.values().stream().reduce(1L, Math::multiplyExact);

System.out.println("iterations:" + iterations);

В качестве альтернативы

Map<Integer,Long> map = nestedCompetitor.stream()
    .collect(Collectors.groupingBy(l -> l.get(l.size() - 1).getPower(),
        () -> new TreeMap<>(Comparator.<Integer>reverseOrder()),
        Collectors.counting()));

map.forEach((powerSet,powerCount) ->
    System.out.println("powerSet:" + powerSet + " -> " + "powerCount:" + powerCount));

Long iterations = map.values().stream().reduce(1L, Math::multiplyExact);

System.out.println("iterations:" + iterations);

Общим для обоих является подсчет вхождений прямо в операции сбора.Обычно вы найдете один из двух коллекторов, toMap или groupingBy, более подходящий для конкретной задачи, но здесь это не имеет большого значения.

В принципе, toMap будетболее эффективно, когда для каждого есть много разных ключей и довольно небольшое количество вхождений, тогда как groupingBy будет на шаг впереди, когда будет достаточно небольшое количество разных ключей с довольно большим количеством элементов для каждого (хотя, в случае, еслииз counting(), это относится только к Java 9 или новее).

...