给定行列表的列表,将每一行的字符串表示形式映射到它的总出现次数

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 操作,因为这会让您留下所有不同的行,否则在您对它们进行分组并最终只计算它们中的每一个之前。