1

让我首先更准确地描述这项任务。给出了以下类和内部类:

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是必需的,并且有一个解决方案 withCollectors.toMap和 one with 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但无济于事的组合。

怎么做到呢?

4

1 回答 1

1

您可以使用它们的字符串表示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操作已在解决方案中被有意删除,因为否则在您对它们进行分组并最终只对它们中的每一个进行计数之前,这会给您留下所有不同的行。

于 2020-07-10T16:38:32.347 回答