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