Как вывести те слова из файла, последняя буква которых равна первой букве следующего через stream
У меня есть файл. Его содержимое
Hello World!
Hello Java!
Apple Eagle Apple
Dog Ground Dog
Я написал метод
public static List<String> getWordsListEndingWithLetterEqualFirstLetterOfNextWord(String file) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
List<String> list = new ArrayList<>();
String line;
while ((line = bufferedReader.readLine()) != null) {
list.addAll(Arrays.asList(line.split(" ")));
}
return list.stream()
.filter((i -> i.charAt(i.length() - 1) == (i + 1).charAt(0)))
.collect(Collectors.toList());
}
Сначала я разбиваю файл по отдельным словам, а потом добавляю в список. Далее через stream я пытаюсь сравнить последнюю букву элемента с первой буквой следующего элемента. Вот только не понимаю почему вместо == я не могу использовать equalsIsIgnoreCase(). Могу только в случае, если убрать charAt(). Даже если заменить все заглавные буквы на строчные, то выведет только eagle(видимо, переход на след. элемент я неправильно прописал и сравниваются 1-ая и последняя буква слова). Очень приветствуется объяснение того, почему это не работает.
Ожидаемый вывод
[Apple, Dog, Ground]
Ответы (1 шт):
Автор решения: Дмитрий
→ Ссылка
Пробуйте так:
public static List<String> getWordsListEndingWithLetterEqualFirstLetterOfNextWord(String file) throws IOException {
final List<String> list = Files.lines(Paths.get(file))
.flatMap(line->Arrays.stream(line.split(" ")))
.collect(Collectors.toList());
return IntStream.range(0, list.size()-1)
.filter(i -> {
String current = list.get(i);
String next = list.get(i+1);
return current.substring(current.length()-1).equalsIgnoreCase(next.substring(0, 1));
})
.mapToObj(list::get)
.collect(Collectors.toList());
}