Отфильтровать ArrayList исключив строки с заглавными буквами

Рейтинг: 0Ответов: 1Опубликовано: 08.02.2023

Есть список stringList, элементами которого являются строки.

Нужно написать метод correctedList(), который создаст и вернет новый список, одержащий все строки, не содержащие буквы только в верхнем регистре(Заглавные).

public static List<String> correctedList(List<String> stringList) {
    return stringList;
}

пробовал прогонять через циклы for, а также с помощью метода Arrays.sort(T[],Comparator), ни одно, ни другое не получилось.

Пытался гуглить, не получилось. Прошу помощи или хотя бы подсказки

public static List<String> correctedList(List<String> stringList) {
    String [] string = new String[stringList.size()];
    for (int j = 0; j < string.length; j++) {
        for (int i = 0; i < stringList.toArray().length; i++) {
            if (stringList.indexOf(i) <= 'Z' && stringList.indexOf(i) >= 'A') {
                stringList.remove(j);
            }
        }
    }
    return stringList;
}

Ответы

▲ 1Принят

Задача не совсем о сортировке, т.е. об упорядочении списка, а скорее о фильтрации данных.

Условие не содержащие буквы только в верхнем регистре(Заглавные) можно проверить при помощи регулярного выражения \\p{Lu}+ (для обработки любых заглавных букв, а не только английского алфавита) и метода String::matches.

Также для преобразования списка удобно использовать Stream API:

import java.util.stream.Collectors;

public static List<String> correctedList(List<String> stringList) {
   return stringList.stream()
       .filter(str -> !str.matches("\\p{Lu}+"))
       .collect(Collectors.toList());
}

Реализация с циклом может выглядеть так:

public static List<String> correctedList(List<String> stringList) {
   List<String> result = new ArrayList<>();
   for (String str : stringList) {
       if (!str.matches("\\p{Lu}+")) {
           result.add(str);
       }
   }
   return result;
}

Альтернативное решение -- проверять содержимое каждой строки при помощи Character::isUpperCase и Stream::allMatch:

public static List<String> correctedListNotAllCaps(List<String> stringList) {
   return stringList.stream()
       .filter(str -> !str.chars().allMatch(Character::isUpperCase))
       .collect(Collectors.toList());
}

Также можно отфильтровать и удалить строки, содержащие хотя бы одну заглавную букву:

public static List<String> correctedListNoneCaps(List<String> stringList) {
   return stringList.stream()
       .filter(str -> str.chars().noneMatch(Character::isUpperCase))
       .collect(Collectors.toList());
}

Тест:

List<String> data = Arrays.asList("A", "a", "Aa", "AAA", "aaa", "aaA");

System.out.println("regex  : " + correctedList(data));
System.out.println("not all: " + correctedListNotAllCaps(data));
System.out.println("no caps: " + correctedListNoneCaps(data));
regex  : [a, Aa, aaa, aaA]
not all: [a, Aa, aaa, aaA]
no caps: [a, aaa]