为了账号安全,请及时绑定邮箱和手机立即绑定

获取列表中特定字符串的最后一次出现

获取列表中特定字符串的最后一次出现

人到中年有点甜 2022-06-15 10:36:25
我有一个简单的字符串列表。我的目标是按组获取列表中每个字符串的最后一次出现。这是模式代码: 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”。怎么做?
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

要获取每个组的最后一次出现,您可以使用带有 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]


查看完整回答
反对 回复 2022-06-15
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

正如其他答案已经表明的那样,有几种方法可以做到这一点。我会发现类似以下自然的东西:


    Collection<String> lastOfEach = newData.stream()

            .collect(Collectors.groupingBy((String s) -> s.split("-")[0],

                    Collectors.reducing("", s -> s, (l, r) -> r)))

            .values();


    lastOfEach.forEach(System.out::println);

使用您的列表,输出为:


A-fdsfdsfgs

B-dsdfsad

我的分组与其他几个答案相同。在分组值上,我执行缩减,每次我得到两个字符串时都取后者。最后,这将根据要求为我们提供每个组的最后一个字符串。由于groupingBy生成了地图,我使用values丢弃键 (A和B) 并仅获取原始字符串。


查看完整回答
反对 回复 2022-06-15
?
慕田峪9158850

TA贡献1794条经验 获得超8个赞

import java.util.*;

class Solution {

    public static void main(String[] args) {

        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");

        System.out.println(lastOccurrences(newData).toString());

    }


    private static List<String> lastOccurrences(List<String> data){

        Set<String> set = new HashSet<>();

        List<String> ans = new ArrayList<>();

        for(int i=data.size()-1;i>=0;--i){

            String group = data.get(i).substring(0,data.get(i).indexOf("-"));

            if(set.contains(group)) continue;

            set.add(group);

            ans.add(data.get(i));

        }


        return ans;

    }

}

输出:


[B-dsdfsad, A-fdsfdsfgs]

算法:

  • 从最后一个移到第一个,而不是从第一个到最后,因为你想要last occurrences。这将使管理更容易,代码更简洁。

  • 使用substring()方法获取字符串所属的组。

  • 使用一来跟踪已经访问过的组。

  • 如果一个组不在集合中,则将其添加到集合中,并将当前字符串添加到该组的答案中(因为这将是最后一次出现)。

  • 最后,返回列表。


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号