首页 > 解决方案 > 获取列表中特定字符串的最后一次出现

问题描述

我有一个简单的字符串列表。我的目标是按组获取列表中每个字符串的最后一次出现。

这是模式代码:

 List<String> newData =  new ArrayList<>();
    newData.add("A-something");
    newData.add("A-fdfdsfds");
    newData.add("A-fdsfdsfgs");
    newData.add("B-something");
    newData.add("B-dsafdrsafd");
    newData.add("B-dsdfsad");

我希望只得到每组的最后一次出现。换句话说,我只想得到“A-fdsfdsfgs”和“B-dsdfsad”。

怎么做?

标签: javastringlist

解决方案


要获取每个组的最后一次出现,您可以使用带有 groupingBy 的流 api:

import static java.util.stream.Collectors.*;

Map<String, Optional<String>> collect = newData.stream()
            .collect(groupingBy(strings -> strings.split("-")[0], 
                    mapping(s -> s, maxBy(Comparator.comparingInt(newData::lastIndexOf)))));

注意:地图有Optional一个值

要获得它而不Optional使用toMap而不是groupingBy

Map<String, String> collect = newData.stream()
            .collect(toMap(s -> s.split("-")[0], 
                    Function.identity(), 
                    (s1, s2) -> newData.lastIndexOf(s1) > newData.lastIndexOf(s2) ? s1 : s2));

此外,如果您想拥有没有组名的地图值,请更改Function.identity()s -> s.split("-")[1]


推荐阅读