繁体   English   中英

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

[英]Use Java streams to get nth element from a list

我有一个字符串列表,如"/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)

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

只是每个地图List到的第三个元素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());

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

使用正则表达式删除除第三个术语以外的所有术语,过滤掉空,瞧!

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(最终结果)为空。

这种方法只处理Strings,它通过避免丑陋的数组代码来保持简单。

你快到了。

过滤大小为3的列表后,获取第三个元素并将其转换为整数。

另请注意,拆分String /100/200将为您提供一个String[]["", "100", "200"] ),并将空字符串作为第一个元素。 所以,我跳过第一个元素使用skip(1)

List<Integer> result = slashString.stream()
            .map(x-> Arrays.stream(x.split("/"))
                    .skip(1)
                    .collect(Collectors.toList()))
            .filter(x -> x.size() >= 3)
            .map(list -> Integer.valueOf(list.get(2)))
            .collect(Collectors.toList());

您不需要制作中间列表。 而是将每个字符串转换为空的流或仅包含skip(n).limit(1)的第n个元素,并使用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());

您可以使用skiplimit轻松实现它,如此

final int elementToFetch = 3;
List<Integer> selectedVals = slashString.stream()
        .map(s -> Arrays.stream(s.split("/")).skip(elementToFetch).limit(elementToFetch + 1)
                        .map(Integer::valueOf).collect(Collectors.toList()))
        .flatMap(List::stream)
        .collect(Collectors.toList());

上述解决方案还将优雅地处理由于split操作而创建的第一个空元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM