按数组索引过滤Java流

问题描述 投票:0回答:2

我有一个带有这样的行的文件:

Adult literacy rate, population 15+ years, female (%),United Republic of Tanzania,2015,76.08978
Adult literacy rate, population 15+ years, female (%),Zimbabwe,2015,85.28513
Adult literacy rate, population 15+ years, male (%),Honduras,2014,87.39595
Adult literacy rate, population 15+ years, male (%),Honduras,2015,88.32135

如果我这样做:

try {
            Stream<String> file = Files.lines(Paths.get("file.csv"));
                file
                .filter(r -> r.startsWith("f",43))
                .forEach(r -> System.out.println(r));
                file.close();
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

我得到女性。为什么这不起作用?

        .map(row -> row.split(","))
        .filter(r[2].startsWith("f"))

我可以这样打印r [2]

    .forEach(r -> System.out.println(r[2]));

至少使r [2]存在。

java stream
2个回答
1
投票

您在逗号后有空格,因此split方法将返回以逗号开头的字符串。因此,您需要使用r.split[2].charAt(1) == 'f'r.split[2].startsWith(" f")来说明该空间。

而且,正如Ousmane D.指出的那样,您不应该有.filter(r[2].startsWith("f"),应该是.filter( r-> r[2].startsWith(" f"),但这可能只是一个错字


0
投票

您应修剪索引2处的元素以消除逗号(,)后的空格,例如]

import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        System.out.println(Stream
                .of("Adult literacy rate, population 15+ years, female (%),United Republic of Tanzania,2015,76.08978",
                        "Adult literacy rate, population 15+ years, male (%),Honduras,2014,87.39595")
                .filter(row -> row.split(",")[2].trim().startsWith("f"))
                .collect(Collectors.toList()));
    }
}

输出:

[Adult literacy rate, population 15+ years, female (%),United Republic of Tanzania,2015,76.08978]

此外,请注意,您不需要使用如上所示的.map

© www.soinside.com 2019 - 2024. All rights reserved.