Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 根据设置的项目对列表中的项目进行编号_List_Java 8_Set_Java Stream - Fatal编程技术网

List 根据设置的项目对列表中的项目进行编号

List 根据设置的项目对列表中的项目进行编号,list,java-8,set,java-stream,List,Java 8,Set,Java Stream,我正在使用一个类来执行我的问题 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 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);
powerCount
为项目编号

现在,我想根据每个
集合
项目
列表
中获取项目编号

我知道我可以使用从项目集获取的创建过滤器,应用于列表和计数

但是,有优化的选项吗?您可以使用

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 Map=nestedCompetitor.stream()
.collect(collector.toMap)(
l->l.get(l.size()-1).getPower(),list->1L,Long::sum,
()->新树形图(Comparator.reverseOrder());
map.forEach((功率集,功率计数)->
System.out.println(“功率集:“+powerSet+”->“+”功率计数:“+powerCount”);
长迭代=map.values().stream().reduce(1L,数学::multiplyExact);
System.out.println(“迭代次数:“+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);
Map Map=nestedCompetitor.stream()
.collect(收集器.groupingBy(l->l.get(l.size()-1).getPower(),
()->新树映射(Comparator.reverseOrder()),
收集器。计数();
map.forEach((功率集,功率计数)->
System.out.println(“功率集:“+powerSet+”->“+”功率计数:“+powerCount”);
长迭代=map.values().stream().reduce(1L,数学::multiplyExact);
System.out.println(“迭代次数:“+iterations”);
这两种方法的共同点是在collect操作中正确计算发生次数。通常,您会发现两个收集器中的一个,
toMap
groupingBy
,更适合于特定的任务,但在这里,它没有太大区别


原则上,
toMap
在有很多不同的键且每个键的出现次数非常少时效率更高,而
groupingBy
在有非常少的不同键且每个键的元素数量非常大时效率更高(尽管在
计数()的情况下)
,这只适用于Java 9或更高版本)。

您能写一个输出的示例吗?从你的描述中不清楚。什么是“数字项目”?你是说列表的大小吗?你是想说你想根据获得的集合的顺序对列表进行排序吗?对于comparator来说,这不是很简单吗?它会比较每个列表最后一个元素的能力?另一方面,如果你想计算的话,让他们开始有点困难。我非常感谢你对我提交的代码的改进意见和建议
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);