带有列表的Java流

时间:2017-12-11 18:42:41

标签: java java-stream

我是溪流及其工作方式的新手,我正试图让列表中添加的特定对象出现。

我找到了一种使用Collections执行此操作的方法。它如下:

for (int i = 0; i < countries.size(); i++) {
    int occurrences = Collections.frequency(countries, countries.get(i));
}

但我想使用流。 我与流一起使用的方法是:

countries.parallelStream().filter(p -> p.contentEquals(countries.get(countries.size()-1))).count()

这只返回当前对象及其出现次数,而我希望 all 对象及其出现次数。

编辑:

`private final ArrayList<String> countries = new ArrayList<>();

dataset.setValue(countries.parallelStream()
                                          .filter(p -> p.contentEquals(countries.get(countries.size()-1)) )
                                          .count(),
                                                "",
                                          countries.get(countries.size()-1)); //sets the graph for the given country
@Override
    public void addCountries(String country) {
       countries.add(country);
    }

    @Override
    public void removeCountries(int country) {
       countries.remove(country);
    }`

我正在制作图表。 dataset.setValue()的第一个陈述是国家/地区的出现次数。必须为每个国家/地区执行此操作,以便您可以查看某个国家/地区的出现次数。希望这有帮助

the graph

编辑2:已解决!

countries.stream().distinct().forEach(o -> 
                dataset.setValue(Collections.frequency(countries, o),
                                                "",
                                                o)); //sets the graph for the given country

2 个答案:

答案 0 :(得分:3)

您还可以使用分组收集器:

Collection<Integer> collection = Arrays.asList(1, 2, 1, 4, 2);
final Map<Integer, Long> map = collection.stream().collect(
        Collectors.groupingBy(el -> el, Collectors.counting()));
System.out.println(map);

这会产生

{1=2, 2=2, 4=1}

答案 1 :(得分:0)

你可以这样做:

 List<Integer> lista = new ArrayList<>(Arrays.asList(1,2,3,3,2,1,5,4,1,2,3));
 lista.stream().distinct().forEach(o -> System.out.println(o + " occures " + Collections.frequency(lista, o) + " times in a list !"));

输出:

1在列表中出现3次!

2在列表中出现3次!

3在列表中出现3次!

5在列表中出现1次!

4在列表中出现1次!

简而言之:

我们从列表中创建流,我们使用.distinct()从流中删除重复项,现在当我们从列表中留下唯一元素时,我们使用Collections.frequency打印出每个元素出现的次数在列表中。