猿问

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

我有一个字符串列表,例如"/100" "/100/200"。我希望将这些字符串除以/,然后得到一个整数列表,例如[[100],[100,200]]。我想遍历该列表的列表,如果该列表足够长,则从每个列表中获取第n个元素,否则移至下一个列表。


众所周知,每个内部列表都是最大长度n。


例子 :


n= 3

slashString -> "/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)

我能够思考到上面。我最终将如何在所有整数列表中收集第三个元素。


芜湖不芜
浏览 567回答 3
3回答

白衣非少年

只需将每个映射List到的第3个元素List并收集:List<Integer> list = Stream.of ("100/200/300","200/300","100/200/400")&nbsp; &nbsp; .map(x->Arrays.stream(x.split("/")).collect(Collectors.toList()))&nbsp; &nbsp; .filter(x->x.size()==3)&nbsp; &nbsp; .map(l->Integer.valueOf (l.get(2)))&nbsp; &nbsp; .collect(Collectors.toList());请注意,您必须消除/输入Strings的前导。否则,1st和3rdList的长度将为4,并且它们将不通过过滤器。或者,您可以要求List大小为4而不是3(并更改l.get(2)为l.get(3))。

宝慕林4294392

使用正则表达式删除除第三项以外的所有项,过滤出空项,瞧!List<Integer> list = Stream.of("100/200/300", "200/300", "100/200/400")&nbsp; &nbsp; .map(s -> s.replaceAll("^([^/]/[^/]/)?([^/]+)?(/.*)?", "$2"))&nbsp; &nbsp; .filter(s -> !s.isEmpty())&nbsp; &nbsp; .map(Integer::valueOf)&nbsp; &nbsp; .collect(Collectors.toList());正则表达式始终匹配整个字符串,并将其替换为第3个术语(捕获为第2组),但是由于所有内容都是可选的,因此如果没有第3个术语,则第2组(最终结果)为空白。这种方法只处理字符串,通过避免使用丑陋的数组代码,使事情变得更简单。

有只小跳蛙

您无需制作中间列表。而是将每个字符串转换为空或仅包含第n个元素的流,skip(n).limit(1)并用于flatMap将所有小流合并在一起:Pattern delimiter = Pattern.compile("/");int n = 3;List<Integer> result = slashString.stream()&nbsp; &nbsp; &nbsp; &nbsp; .flatMap(s -> delimiter.splitAsStream(s).skip(n).limit(1))&nbsp; &nbsp; &nbsp; &nbsp; .map(Integer::valueOf)&nbsp; &nbsp; &nbsp; &nbsp; .collect(toList());
随时随地看视频慕课网APP

相关分类

Java
我要回答