ArrayList содержит чувствительность к регистру - PullRequest
64 голосов
/ 06 января 2012

В настоящее время я использую метод содержимого, принадлежащий классу ArrayList, для выполнения поиска. Есть ли способ сделать этот поиск нечувствительным к регистру в Java? Я обнаружил, что в C # можно использовать OrdinalIgnoreCase. Есть ли эквивалент Java или другой способ сделать это? Спасибо.

Ответы [ 18 ]

2 голосов
/ 02 ноября 2017

Я бы сделал так:

public boolean isStringInList(final List<String> myList, final String stringToFind) {
    return myList.stream().anyMatch(s -> s.equalsIgnoreCase(stringToFind));
}  
2 голосов
/ 15 марта 2017

Для java8

list.stream (). AnyMatch (s -> s.equalsIgnoreCase (yourString))

Для

  • в соответствии с предложением Аарона Дж. Ланга выше
  • Или, если вам известен регистр вашего списка (все верхний / нижний регистр), перед сравнением
2 голосов
/ 06 января 2012

Метод contains основан на том, что возвращает метод equals объектов, хранящихся в вашем ArrayList.Так что да, это возможно, если вы используете объекты, где equals использует сравнение без учета регистра.

Таким образом, вы можете, например, использовать такой класс (код может содержать некоторые опечатки)

public class CaseInsensitiveString{
  private final String contents;

  public CaseInsensitiveString( String contents){ this.contents = contents; }

  public boolean equals( Object o ){
    return o != null && o.getClass() == getClass() && o.contents.equalsIgnoreCase( contents);
  }

  public int hashCode(){
    return o.toUpperCase().hashCode();
  }
}
1 голос
/ 30 октября 2018

Не изобретай велосипед. Используйте хорошо проверенные API. Для вашей цели используйте Apache Commons StringUtils .

Из Javadoc: Сравнивает данную строку с переменным CharSength от searchStrings возвращает true, если строка равна любому из searchStrings, игнорируя регистр.

import org.apache.commons.lang3.StringUtils;
...
StringUtils.equalsAnyIgnoreCase(null, (CharSequence[]) null) = false
StringUtils.equalsAnyIgnoreCase(null, null, null)    = true
StringUtils.equalsAnyIgnoreCase(null, "abc", "def")  = false
StringUtils.equalsAnyIgnoreCase("abc", null, "def")  = false
StringUtils.equalsAnyIgnoreCase("abc", "abc", "def") = true
StringUtils.equalsAnyIgnoreCase("abc", "ABC", "DEF") = true
1 голос
/ 14 июля 2015

Нет необходимости в дополнительной функции, желаемые результаты могут быть достигнуты путем приведения сравниваемых строк в верхний или нижний регистр

(я знаю, что это было предложено в комментариях, но не полностью представлено какответ)

Пример: Игнорирует регистр при фильтрации содержимого JList на основе входных данных, предоставленных JTextField:

private ArrayList<String> getFilteredUsers(String filter, ArrayList<User> users) {
    ArrayList<String> filterUsers = new ArrayList<>();
    users.stream().filter((user) -> (user.getUsername().toUpperCase().contains(filter.toUpperCase()))).forEach((user)-> {
        filterUsers.add(user.getUsername());
    });
    this.userList.setListData(filterUsers.toArray());
    return filterUsers;
    /** 
     *  I see the redundancy in returning the object... so even though,
     *  it is passed by reference you could return type void; but because
     *  it's being passed by reference, it's a relatively inexpensive
     *  operation, so providing convenient access with redundancy is just a 
     *  courtesy, much like putting the seat back down. Then, the next
     *  developer with the unlucky assignment of using your code doesn't 
     *  get the proverbially dreaded "wet" seat.
     */
}
0 голосов
/ 06 января 2012

С помощью compareToIgnoreCase, http://docs.oracle.com/javase/1.3/docs/api/java/lang/String.html#compareToIgnoreCase%28java.lang.String%29 вы сможете делать то, что хотите!

0 голосов
/ 17 ноября 2017

Если вы не хотите создавать новую функцию, вы можете попробовать этот метод:

List<String> myList = new ArrayList<String>(); //The list you're checking
String wordToFind = "Test"; //or scan.nextLine() or whatever you're checking

//If your list has mix of uppercase and lowercase letters letters create a copy...
List<String> copyList = new ArrayList<String>();
for(String copyWord : myList){
   copyList.add(copyWord.toLowerCase());
}

for(String myWord : copyList){
   if(copyList.contains(wordToFind.toLowerCase()){
      //do something
   }
}
0 голосов
/ 10 августа 2016

Это лучший способ преобразовать ваш элемент списка в нижний регистр. После конвертации вы будете использовать метод метода. как

List<String> name_list = new ArrayList<>();
name_list.add("A");
name_list.add("B");

Создать строчный список, используя созданный выше name_list

List<String> name_lowercase_list = new ArrayList<>();
for(int i =0 ; i<name_list.size(); i++){
 name_lowercase_list.add(name_list.get(i).toLowerCase().toString()); 
}

for(int i =0 ; i<name_list.size(); i++){
  String lower_case_name =  name_list.get(i).toLowerCase().toString();
  if(name_list.get(i).contains(your compare item) ||
   name_lowercase_list.get(i).contains(your compare item) ){
     //this will return true
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...