Отфильтровать ArrayList исключив строки с заглавными буквами
Есть список 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]