检查字符串数组包含无环子串

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

我想找到一个字符串数组的子串,而不使用循环。我正在使用:

import java.util.Arrays;

public class MyClass {
    public static void main(String args[]) {

        String[] files = new String[]{"Audit_20190204_061439.csv","anotherFile"};
        String substring= ".csv";

        if(!Arrays.stream(files).anyMatch(substring::contains)) {
            System.out.println("Not found:" + substring);
        }
    }
}

我一直都想与未找到。什么是错误的做法?

java arrays java-stream
3个回答
3
投票

正在检查的String名为“.csv”是否不包含任何您Stream,这是你想的正好相反的元素。

它应该是:

if (!Arrays.stream(files).anyMatch(s -> s.contains(substring))) {
    System.out.println("Not found:" + substring);
}

附:至于评论,你可以使用noneMatch代替anyMatch,这将节省需要否定的条件:

if (Arrays.stream(files).noneMatch(s -> s.contains(substring))) {
    System.out.println("Not found:" + substring);
}

如果名为“.csv”子只应在String(即作为后缀处理)年底进行搜索,您应该使用endsWithcontains


2
投票

您可能需要检查的文件扩展名并可以改用endsWith它和改善你的条件:

if (Arrays.stream(files).noneMatch(a -> a.endsWith(substring))) {
    System.out.println("Not found:" + substring);
}

1
投票

我不是一个流大师,但我相信,你想是这样的:

String[] files = new String[] { "Audit_20190204_061439.csv", "anotherFile" };

for (String file : files) {
    if (file.endsWith(".csv")) {
        System.out.println("found a CSV file");
    }
}

我用String#endsWith这里,是因为想必.csv是指文件扩展名,如果出现在文件名末尾应该只注册一个打击。

我们也可以在这里使用String#matches

Pattern pattern = Pattern.compile(".*\\.csv$");
for (String file : files) {
    Matcher matcher = pattern.matcher(file);
    if (matcher.find()) {
        System.out.println("found a CSV file");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.