如何检查字符串是否以Java中的字符串列表中的任何条目结尾

时间:2017-07-16 04:35:59

标签: java

我有一个文件名和扩展名列表。我想检查文件名是否以我所拥有的列表中的任何扩展名结尾。

String fileName = "abc.txt";
String[] extensions = {".txt", ".doc", ".pdf"};

我可以手动检查扩展列表,检查文件是否以列表中的任何扩展名结尾。

public static boolean checkIfFileHasExtension(String s, String[] extn) {
    for (String entry : extn) {
        if (s.endsWith(entry)) {
            return true;
        }
    }
    return false;
}

public static void main (String[] args) throws java.lang.Exception
{
    // your code goes here

    String fileName = "abc.txt";
    String[] extensions = {".txt", ".doc", ".pdf"};
    System.out.println(checkIfFileHasExtension(fileName, extensions));
}

使用StringUtils或Streams或任何其他Java库有更好的方法吗?我正在寻找一个单线。谢谢!

5 个答案:

答案 0 :(得分:9)

试试这个。

public static boolean checkIfFileHasExtension(String s, String[] extn) {
    return Arrays.stream(extn).anyMatch(entry -> s.endsWith(entry));
}

答案 1 :(得分:3)

如果使用contains(String)而不是数组,则可以使用lastIndexOf()方法。 此外,您可以使用。检索扩展名 String的{​​{1}}方法与subString()方法相结合。

List<String> extensions = Arrays.asList(".txt", ".doc", ".pdf");
boolean isContained = extensions.contains(fileName.subString(fileName.lastIndexOf(".")+1));

答案 2 :(得分:0)

另一种方法是使用.作为分隔符进行标记化

String fileName = "abc.txt";
List<String> extensions = Arrays.asList("txt", "doc", "pdf");

boolean checkExt(String fileName, List<String> extensions)
{
    String s = fileName.split(".");
    return extensions.contains(s[s.length-1]);
}

答案 3 :(得分:0)

Apache Commons Lang StringUtils.endsWithAny与您的方法完全相同。您可以像这样使用它:

public static void main (String[] args) {
    String fileName = "abc.txt";
    String[] extensions = {".txt", ".doc", ".pdf"};
    System.out.println(org.apache.commons.lang3.StringUtils.endsWithAny(fileName, extensions));
}

但是如前所述,它的性能与extensions呈线性关系,因此,如果您有很多,则尝试从文件名中提取扩展名并针对HashSet进行查找:

    String fileName = "abc.txt";
    String[] extensions = {"txt", "doc", "pdf"};
    HashSet<String> extensionsSet = new HashSet<>(Arrays.asList(extensions));
    String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
    System.out.println(extensionsSet.contains(fileExt));

注意HashSet使用更多的内存,因此它比按数组进行线性搜索要慢。如果您将其作为常数使用,则可以,但如果动态使用,则可以衡量您的性能。

如果您可以将前缀用作字符串,则可以尝试使用预编译的正则表达式:它可能会更快地工作。

答案 4 :(得分:-2)

您可以使用StringUtils.indexOfAny

<强>更新

来自javadoc -

public static int indexOfAny(CharSequence str,
                             CharSequence... searchStrs)
Find the first index of any of a set of potential substrings.

A null CharSequence will return -1. A null or zero length search array will return -1. A null search array entry will be ignored, but a search array containing "" will return 0 if str is not null. This method uses String.indexOf(String) if possible.

 StringUtils.indexOfAny(null, *)                     = -1
 StringUtils.indexOfAny(*, null)                     = -1
 StringUtils.indexOfAny(*, [])                       = -1
 StringUtils.indexOfAny("zzabyycdxx", ["ab","cd"])   = 2
 StringUtils.indexOfAny("zzabyycdxx", ["cd","ab"])   = 2
 StringUtils.indexOfAny("zzabyycdxx", ["mn","op"])   = -1
 StringUtils.indexOfAny("zzabyycdxx", ["zab","aby"]) = 1
 StringUtils.indexOfAny("zzabyycdxx", [""])          = 0
 StringUtils.indexOfAny("", [""])                    = 0
 StringUtils.indexOfAny("", ["a"])                   = -1