Java использует содержит функцию для соответствия строкового объекта игнорировать заглавные - PullRequest
2 голосов
/ 21 июня 2011

Я хочу, чтобы функция содержимого возвращала истину, даже если следующие символы прописными буквами

    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 ]

10 голосов
/ 21 июня 2011

Набор - лучший выбор для поиска.

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
}
6 голосов
/ 21 июня 2011

Краткий ответ: не будет работать. Вы не можете перезаписать содержимое, НО: Вы можете использовать следующий код:

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())){

}

Это сделает вас расширением в нижний регистр, и если в вашем массиве все расширения уже имеют более низкий регистр, чем он будет работать.

1 голос
/ 21 июня 2011

Если все ваши форматы строчные, то toLowerCase в сочетании с HashSet является предпочтительным решением.

Если ваши форматы в смешанном регистре (и останутся такими, как вы их используете дляи другие вещи тоже) вам нужно реальное сравнение без учета регистра.

Затем TreeSet (или другой SortedSet) с нечувствительным к регистру составителем, как будет делать компаратор.(Это не так быстро, как HashSet, но все равно будет быстрее, чем ArrayList (за исключением действительно небольших списков).)

В качестве альтернативы вариант HashSet, использующий пользовательский hashCode и равно (или просто обычный HashSet дляОбъекты-оболочки с реализацией equals и hashCode без учета регистра вполне подойдут.

1 голос
/ 21 июня 2011

Преобразуйте ваши 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());
    }
}

Это, вероятно, будет легче читать / поддерживать, если вы создадитерегулярно программируйте, но я оставил это как упражнение читателю.

1 голос
/ 21 июня 2011

Как насчет:

extension.toLowerCase()

Хотя я не уверен на 100% уверен, что метод contains() сделает в этом примере. Возможно, вам придется вставить ваши расширения в Set.

Редактировать: Нет, он не будет работать, так как метод содержит проверяет существование определенного объекта. Ваша строка, даже с тем же значением, является другим объектом. Так что да, либо а) переопределите метод содержимого, например, переберите массив и сделайте сравнение строк, либо б) проще, используйте Set.

Редактировать 2: По-видимому, он будет работать в соответствии с комментариями ниже, так как ArrayList.contains () проверяет равенство (поэтому вы получите совпадение строк), но это, похоже, не согласуется с ответом с наибольшим количеством голосов, который говорит это не будет.

0 голосов
/ 17 февраля 2016

Вы можете использовать IteracleUtils и Predicate из collection4 (apache).

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

0 голосов
/ 14 декабря 2011

Добавить этот расширенный список класса:

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)) {
        ...
...