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

使用Java流从列表中获取第n个元素

使用Java流从列表中获取第n个元素

芜湖不芜 2021-05-04 13:44:36
我有一个字符串列表,例如"/100" "/100/200"。我希望将这些字符串除以/,然后得到一个整数列表,例如[[100],[100,200]]。我想遍历该列表的列表,如果该列表足够长,则从每个列表中获取第n个元素,否则移至下一个列表。众所周知,每个内部列表都是最大长度n。例子 :n= 3slashString -> "/100/200/300","/200/300","/100/200/400"在上述情况下,我希望将整数列表作为300,400。List<Integer> output = slashString.stream()        .map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))        .filter(x->x.size()==3)我能够思考到上面。我最终将如何在所有整数列表中收集第三个元素。
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

只需将每个映射List到的第3个元素List并收集:


List<Integer> list = Stream.of ("100/200/300","200/300","100/200/400")

    .map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))

    .filter(x->x.size()==3)

    .map(l->Integer.valueOf (l.get(2)))

    .collect(Collectors.toList());

请注意,您必须消除/输入Strings的前导。否则,1st和3rdList的长度将为4,并且它们将不通过过滤器。或者,您可以要求List大小为4而不是3(并更改l.get(2)为l.get(3))。


查看完整回答
反对 回复 2021-05-19
?
宝慕林4294392

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

使用正则表达式删除除第三项以外的所有项,过滤出空项,瞧!


List<Integer> list = Stream.of("100/200/300", "200/300", "100/200/400")

    .map(s -> s.replaceAll("^([^/]/[^/]/)?([^/]+)?(/.*)?", "$2"))

    .filter(s -> !s.isEmpty())

    .map(Integer::valueOf)

    .collect(Collectors.toList());

正则表达式始终匹配整个字符串,并将其替换为第3个术语(捕获为第2组),但是由于所有内容都是可选的,因此如果没有第3个术语,则第2组(最终结果)为空白。


这种方法只处理字符串,通过避免使用丑陋的数组代码,使事情变得更简单。


查看完整回答
反对 回复 2021-05-19
?
有只小跳蛙

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

您无需制作中间列表。而是将每个字符串转换为空或仅包含第n个元素的流,skip(n).limit(1)并用于flatMap将所有小流合并在一起:


Pattern delimiter = Pattern.compile("/");

int n = 3;


List<Integer> result = slashString.stream()

        .flatMap(s -> delimiter.splitAsStream(s).skip(n).limit(1))

        .map(Integer::valueOf)

        .collect(toList());


查看完整回答
反对 回复 2021-05-19
  • 3 回答
  • 0 关注
  • 566 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信