Java使用包含函数来匹配字符串对象忽略大写情况?

时间:2011-06-21 09:59:46

标签: java contains case-insensitive

我希望contains函数应该返回true,即使以下是大写字母

    List<String> pformats= Arrays.asList("odt","ott","oth","odm","sxw","stw","sxg","doc","dot","xml","docx","docm","dotx","dotm","doc","wpd","wps","rtf","txt","csv","sdw","sgl","vor","uot","uof","jtd","jtt","hwp","602","pdb","psw","ods","ots","sxc","stc","xls","xlw","xlt","xlsx","xlsm","xltx","xltm","xlsb","wk1","wks","123","dif","sdc","vor","dbf","slk","uos","pxl","wb2","odp","odg","otp","sxi","sti","ppt","pps","pot","pptx","pptm","potx","potm","sda","sdd","sdp","vor","uop","cgm","bmp","dxf","emf","eps","met","pbm","pct","pcd","pcx","pgm","plt","ppm","psd","ras","sda","sdd","sgf","sgv","svm","tgs","tif","tiff","vor","wmf","xbm","xpm","jpg","jpeg","gif","png","pdf","log");

if(pformats.contains(extension)){
    // do stuff
}

7 个答案:

答案 0 :(得分:10)

Set是查找的更好选择。

private static final Set<String> P_FORMATS = new HashSet<String>(Arrays.asList(
    "odt,ott,oth,odm,sxw,stw,sxg,doc,dot,xml,docx,docm,dotx,dotm,doc,wpd,wps,rtf,txt,csv,sdw,sgl,vor,uot,uof,jtd,jtt,hwp,602,pdb,psw,ods,ots,sxc,stc,xls,xlw,xlt,xlsx,xlsm,xltx,xltm,xlsb,wk1,wks,123,dif,sdc,vor,dbf,slk,uos,pxl,wb2,odp,odg,otp,sxi,sti,ppt,pps,pot,pptx,pptm,potx,potm,sda,sdd,sdp,vor,uop,cgm,bmp,dxf,emf,eps,met,pbm,pct,pcd,pcx,pgm,plt,ppm,psd,ras,sda,sdd,sgf,sgv,svm,tgs,tif,tiff,vor,wmf,xbm,xpm,jpg,jpeg,gif,png,pdf,log".split(","));

if(P_FORMATS.contains(extension.toLowerCase())){
    // do stuff
}

答案 1 :(得分:6)

简短回答:不行。你不能覆盖包含,但是你可以使用以下代码:

List<String> pformats= Arrays.asList("odt","ott","oth","odm","sxw","stw","sxg","doc","dot","xml","docx","docm","dotx","dotm","doc","wpd","wps","rtf","txt","csv","sdw","sgl","vor","uot","uof","jtd","jtt","hwp","602","pdb","psw","ods","ots","sxc","stc","xls","xlw","xlt","xlsx","xlsm","xltx","xltm","xlsb","wk1","wks","123","dif","sdc","vor","dbf","slk","uos","pxl","wb2","odp","odg","otp","sxi","sti","ppt","pps","pot","pptx","pptm","potx","potm","sda","sdd","sdp","vor","uop","cgm","bmp","dxf","emf","eps","met","pbm","pct","pcd","pcx","pgm","plt","ppm","psd","ras","sda","sdd","sgf","sgv","svm","tgs","tif","tiff","vor","wmf","xbm","xpm","jpg","jpeg","gif","png","pdf","log");
                            if(pformats.contains(extension.toLowerCase())){

}

这会使你扩展为小写,如果在你的数组中所有扩展都已经是lowerCase,那么它就会被wokk。

答案 2 :(得分:1)

怎么样:

extension.toLowerCase()

虽然我不确定100%确定contains()方法在这个例子中会做什么。您可能需要将扩展​​程序粘贴到Set

编辑:不会因为contains方法检查是否存在特定对象而无法正常工作。即使具有相同的值,您的字符串也是不同的对象。所以是的,或者a)覆盖contains方法,例如循环遍历数组并进行字符串比较或b)更简单,使用Set。

编辑2:显然它可以在下面的评论中工作,因为ArrayList.contains()检查是否相等(所以你会得到一个字符串匹配),但这似乎不同意最高投票的答案说它不会。

答案 3 :(得分:1)

List个扩展名转换为正则表达式,使用CASE_INSENSITVE标记进行编译,并使用它。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public final class Foo {
    public static void main(final String... args) {
        final Pattern p = Pattern.compile("odt|ott|oth|odm|sxw|stw|sxg|doc|dot|xml|docx|docm|dotx|dotm|doc|wpd|wps|rtf|txt|csv|sdw|sgl|vor|uot|uof|jtd|jtt|hwp|602|pdb|psw|ods|ots|sxc|stc|xls|xlw|xlt|xlsx|xlsm|xltx|xltm|xlsb|wk1|wks|123|dif|sdc|vor|dbf|slk|uos|pxl|wb2|odp|odg|otp|sxi|sti|ppt|pps|pot|pptx|pptm|potx|potm|sda|sdd|sdp|vor|uop|cgm|bmp|dxf|emf|eps|met|pbm|pct|pcd|pcx|pgm|plt|ppm|psd|ras|sda|sdd|sgf|sgv|svm|tgs|tif|tiff|vor|wmf|xbm|xpm|jpg|jpeg|gif|png|pdf|log", Pattern.CASE_INSENSITIVE);
        // Will be true
        System.out.println(p.matcher("bmp").matches());
        // Will be false
        System.out.println(p.matcher("quasar").matches());
    }
}

如果以编程方式构建正则表达式,这可能会更容易阅读/维护,但我已将其作为练习留给读者。

答案 4 :(得分:1)

如果您的所有格式都是小写,那么toLowerCase与HashSet相结合是首选解决方案。

如果您的格式是大小写混合(并且应该保持这种方式,因为您也将其用于其他事情),您需要进行真正的不区分大小写的比较。

然后使用不区分大小写的collat​​or作为比较器的TreeSet(或其他SortedSet)。 (它不如HashSet快,但仍然比ArrayList快(除了非常小的列表)。)

或者,使用自定义hashCode和equals的HashSet变体(或者只是包装对象上的普通HashSet以及equals和hashCode的不区分大小写的实现)会很好。

答案 5 :(得分:0)

添加此扩展List类:

private static class ListIgnoreCase<String> extends java.util.LinkedList {
       public ListIgnoreCase(Collection<String> c) {
           super();
           addAll(c);
       }
       public boolean containsIgnoreCase(java.lang.String toSearch) {
           for (Object element : this)
               if (java.lang.String.valueOf(element).equalsIgnoreCase(toSearch))
                   return true;

           return false;
       }
   }

现在你可以这样打电话给asList

if(new ListIgnoreCase(Arrays.asList("odt","ott","oth","odm"))
      .containtsIgnoreCase(extension)) {
        ...

答案 6 :(得分:0)

您可以使用collections4(apache)中的IteracleUtils和Predicate。

List<String> pformats= Arrays.asList("odt","ott","oth","odm","sxw","stw","sxg","doc","dot","xml","docx","docm","dotx","dotm","doc","wpd","wps","rtf","txt","csv","sdw","sgl","vor","uot","uof","jtd","jtt","hwp","602","pdb","psw","ods","ots","sxc","stc","xls","xlw","xlt","xlsx","xlsm","xltx","xltm","xlsb","wk1","wks","123","dif","sdc","vor","dbf","slk","uos","pxl","wb2","odp","odg","otp","sxi","sti","ppt","pps","pot","pptx","pptm","potx","potm","sda","sdd","sdp","vor","uop","cgm","bmp","dxf","emf","eps","met","pbm","pct","pcd","pcx","pgm","plt","ppm","psd","ras","sda","sdd","sgf","sgv","svm","tgs","tif","tiff","vor","wmf","xbm","xpm","jpg","jpeg","gif","png","pdf","log");

Predicate<String> predicate  = (s) -> StringUtils.equalsIgnoreCase(s, "JPG");
if(IterableUtils.matchesAny(pformats, predicate))
    // do stuff
}

org.apache.commons.collections4.IterableUtils