簡體   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