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

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

Ответы [ 18 ]

65 голосов
/ 06 января 2012

Вы можете использовать это точно так же, как и любой другой ArrayList.Вы можете передать этот Список другому коду, и внешнему коду не нужно будет понимать какие-либо классы обёрток строк.

public class CustomStringList3 extends ArrayList<String> {
    @Override
    public boolean contains(Object o) {
        String paramStr = (String)o;
        for (String s : this) {
            if (paramStr.equalsIgnoreCase(s)) return true;
        }
        return false;
    }
}
35 голосов
/ 03 августа 2016

В Java8, используя anyMatch

List<String> list = Arrays.asList("XYZ", "ABC");
String matchingText = "xYz";

boolean isMatched = list.stream().anyMatch(matchingText::equalsIgnoreCase);
34 голосов
/ 04 марта 2014

Если вы используете Java 8, попробуйте:

List<String> list = ...;
String searchStr = ...;
boolean containsSearchStr = list.stream().filter(s -> s.equalsIgnoreCase(searchStr)).findFirst().isPresent();
14 голосов
/ 06 января 2012

Традиционно вы можете разработать собственную логику для сравнения строк, содержащихся в ArrayList. Это может быть несколько способов, как показано ниже.

public boolean containsCaseInsensitive(String strToCompare, ArrayList<String>list)
{
    for(String str:list)
    {
        if(str.equalsIgnoreCase(strToCompare))
        {
            return(true);
        }
    }
    return(false);
}

Почему бы не использовать некоторые прямые и удобные способы, такие как SortedSet, как показано ниже, с нечувствительным к регистру компаратором ?.

Set<String> a = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);

a.add("A");
a.add("B");
a.add("C");


Set<String> b = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);

b.add("a");
b.add("b");
b.add("c");

System.out.println(b.equals(a));

Сравнил бы два разных набора, игнорируя регистр и вернул true, в этой конкретной ситуации и ваше сравнение работало бы без проблем.

9 голосов
/ 06 января 2012

Глядя на Java API , такого метода для содержимого нет.

Но вы можете сделать как минимум две вещи:

  1. Переопределить равнометод в вашем объекте ArrayList с вашим собственным, или equalsIgnoreCase (str)
  2. Напишите свой собственный метод содержит, который должен перебирать ваши объекты ArrayList, и делать ручную проверку.1013 *

7 голосов
/ 06 января 2012

Предполагая, что у вас есть ArrayList<String>

. Единственный способ, которым я могу придумать, это создать очень легкий класс-обертку вокруг String и переопределить equals и hashcode для игнорирования регистра, используя equalsIgnoreCase() где возможно.Тогда у вас будет ArrayList<YourString>.Хотя это довольно уродливая идея.

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

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

List<String> pformats= Arrays.asList("Test","tEst2","tEsT3","TST4");

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

IterableUtils (collection4): org.apache.commons.collections4.IterableUtils.html

2 голосов
/ 29 марта 2017

В моем случае, поскольку все мои строки в ArrayList находятся в нижнем регистре, я просто выполняю метод String. toLowerCase () для параметра contains (). Как это:

If (yourArrayList.contains (parameterInput.toLowerCase()) {
    // your code here
}

Как видите, вы можете сделать опозицию, если у вашего arrayList есть строки upperCase:

If (yourArrayList.contains (parameterInput.toUpperCase ()) {
    // your code here
}

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

2 голосов
/ 06 января 2012

Другое решение:

public class IgnorecaseList extends ArrayList<String>{

    @Override
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    } 

    @Override
    public int indexOf(Object o) {
        if(o instanceof String){
            for (int i = 0; i < this.size(); i++) {
                if(((String)o).equalsIgnoreCase(get(i))){
                    return i;
                }
            }
        }
        return -1;
    }
}

contains() метод использует indexOf ... В этом решении вы также можете узнать, где позиция является строкой.list.add("a") -> list.indexOf("A") == 0 или list.indexOf("a") == 0 ..

Вам также следует рассмотреть возможность использования набора вместо списка.

2 голосов
/ 06 января 2012

Метод ArrayList has () проверяет равенство, вызывая метод equals () для объекта, который вы предоставляете (НЕ для объектов в массиве).Поэтому немного хакерский способ - создать класс-оболочку вокруг объекта String, например:

class InsensitiveStringComparable {
    private final String val;

    public InsensitiveStringComparable(String val) {
        this.val = val;
    }

    @Override
    public boolean equals(Object x) {
        if (x == this)
            return true;
        else if (x == null)
            return false;
        else if (x instanceof InsensitiveStringComparable)
            return ((InsensitiveStringComparable) x).val.equalsIgnoreCase(val);
        else if (x instanceof String)
            /* Asymmetric equals condition */
            return val.equalsIgnoreCase((String) x);
        else
            return false;
    }

    @Override
    public int hashCode() {
        return val.toUpperCase().hashCode();
    }
}

Затем вы можете использовать его для выполнения теста.Пример «ручного» теста:

public class Test {
    public static void main(String[] args) {
        ArrayList<Object> a = new ArrayList<Object>();
        a.add("test");
        System.out.println(a.contains(new InsensitiveStringComparable("TEST")));
        System.out.println(a.contains(new InsensitiveStringComparable("tEsT")));
        System.out.println(a.contains(new InsensitiveStringComparable("different")));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...