如何在Java中检查字符串是否以字符串列表中的任何条目结尾
我有一个文件名和扩展名列表。我想检查文件名是否以列表中的任何扩展名结尾如何在Java中检查字符串是否以字符串列表中的任何条目结尾,java,Java,我有一个文件名和扩展名列表。我想检查文件名是否以列表中的任何扩展名结尾 String fileName = "abc.txt"; String[] extensions = {".txt", ".doc", ".pdf"}; 我可以手动查看扩展名列表,并检查文件是否以列表中的任何扩展名结尾 public static boolean checkIfFileHasExtension(String s, String[] extn) { for (String entry : extn)
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库有更好的方法吗?我想买一艘一轮的。谢谢 您可以使用
更新
来自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
如果使用的是
列表
而不是数组,则可以使用contains(String)
方法。
此外,您可以使用
lastIndexOf()
与subString()方法相结合的String
方法
List<String> extensions = Arrays.asList(".txt", ".doc", ".pdf");
boolean isContained = extensions.contains(fileName.subString(fileName.lastIndexOf(".")+1));
List extensions=Arrays.asList(“.txt”、“.doc”、“.pdf”);
boolean isContained=extensions.contains(fileName.subString(fileName.lastIndexOf(“.”+1));
试试这个
public static boolean checkIfFileHasExtension(String s, String[] extn) {
return Arrays.stream(extn).anyMatch(entry -> s.endsWith(entry));
}
另一种方法是使用
作为分隔符进行标记化
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]);
}
String fileName=“abc.txt”;
列表扩展=Arrays.asList(“txt”、“doc”、“pdf”);
布尔checkExt(字符串文件名、列表扩展名)
{
字符串s=fileName.split(“.”);
返回扩展。包含(s[s.length-1]);
}
Apache Commons Lang与您的方法完全相同。您可以像这样使用它:
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));
}
但是正如前面提到的,它的性能与扩展名成线性关系,因此如果您有很多扩展名,请尝试从文件名中提取扩展名,并根据哈希集进行查找:
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));
String fileName=“abc.txt”;
字符串[]扩展名={“txt”、“doc”、“pdf”};
HashSet extensionset=新的HashSet(Arrays.asList(extensions));
字符串fileExt=fileName.substring(fileName.lastIndexOf(“.”+1);
System.out.println(extensionset.contains(fileExt));
注意:HashSet
使用的内存要多得多,因此它比按数组进行线性搜索的速度慢。如果您使用at作为常量,这是可以的,但是如果是动态的,那么请测量您的性能
此外,如果可以将前缀用作字符串,则可以尝试使用预编译的regexp:它可能工作得更快。对于一次性文件名和合理数量的扩展名,在实践中不太可能得到比现有解决方案更好的解决方案。(不要担心把它变成一行代码:清晰代码比短代码好。)也就是说,我相信在一般情况下解决这类问题的最佳算法是构建后缀树并进行测试。请解释否决的原因?@DanielPryden感谢你的建议<列表上的code>contains()
是O(N)。如果你想走这条路,设置一个会更好,更清晰。这个答案没有帮助。请添加一个示例或其他内容。或s::endsWith