给定行列表的列表,将每一行的字符串表示形式映射到它的总出现次数
Mapping the string representation of each line, given a list of lists of lines, to its total number of occurrences
首先让我更准确地描述一下作业。给出以下class和内部class:
public class Title {
private List<Line> lines;
public Title() {
this(new ArrayList<>());
}
public Title(List<Line> lines) {
this.lines = lines;
}
public void add(Line l) {
lines.add(l);
}
@Override
public String toString() {
return lines.toString();
}
public List<Line> getLines() {
return new ArrayList<>(lines);
}
public class Line {
private String line;
public Line(String line) {
this.line = line;
}
@Override
public String toString() {
return line;
}
}
假设我们有一个List<Title> titles
。分配是从每一行的字符串表示中获取映射,到它在 titles
中出现的总数。作为提示,据说 flatMap
是必需的,并且有一个 Collectors.toMap
的解决方案和一个 Collectors.groupingBy
.
的解决方案
我想到了前者,但我非常担心它不必要地令人费解。我该如何改进它?这是:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.flatMapping;
import static java.util.Collections.frequency;
Map<String, Integer> countsStringMap1 = titles.stream()
.flatMap(t-> t.getLines().stream().map(Line::toString))
.distinct()
.collect(toMap(Function.identity(),
s -> frequency(titles.stream()
.flatMap(t-> t.getLines()
.stream()
.map(Line::toString))
.collect(toList()), s)));
我无法通过 groupingBy
找到任何解决方案,我尝试了与 Collectors.mapping
的组合但无济于事。
如何做到?
您可以使用 counting
来计算 groupBy
行的字符串表示出现的次数。
Map<String, Long> countsStringMap = titles.stream()
.flatMap(t -> t.getLines().stream().map(Title.Line::toString))
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));
请注意,解决方案中有意删除了 distinct
操作,因为这会让您留下所有不同的行,否则在您对它们进行分组并最终只计算它们中的每一个之前。
首先让我更准确地描述一下作业。给出以下class和内部class:
public class Title {
private List<Line> lines;
public Title() {
this(new ArrayList<>());
}
public Title(List<Line> lines) {
this.lines = lines;
}
public void add(Line l) {
lines.add(l);
}
@Override
public String toString() {
return lines.toString();
}
public List<Line> getLines() {
return new ArrayList<>(lines);
}
public class Line {
private String line;
public Line(String line) {
this.line = line;
}
@Override
public String toString() {
return line;
}
}
假设我们有一个List<Title> titles
。分配是从每一行的字符串表示中获取映射,到它在 titles
中出现的总数。作为提示,据说 flatMap
是必需的,并且有一个 Collectors.toMap
的解决方案和一个 Collectors.groupingBy
.
我想到了前者,但我非常担心它不必要地令人费解。我该如何改进它?这是:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static java.util.stream.Collectors.flatMapping;
import static java.util.Collections.frequency;
Map<String, Integer> countsStringMap1 = titles.stream()
.flatMap(t-> t.getLines().stream().map(Line::toString))
.distinct()
.collect(toMap(Function.identity(),
s -> frequency(titles.stream()
.flatMap(t-> t.getLines()
.stream()
.map(Line::toString))
.collect(toList()), s)));
我无法通过 groupingBy
找到任何解决方案,我尝试了与 Collectors.mapping
的组合但无济于事。
如何做到?
您可以使用 counting
来计算 groupBy
行的字符串表示出现的次数。
Map<String, Long> countsStringMap = titles.stream()
.flatMap(t -> t.getLines().stream().map(Title.Line::toString))
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));
请注意,解决方案中有意删除了 distinct
操作,因为这会让您留下所有不同的行,否则在您对它们进行分组并最终只计算它们中的每一个之前。