Просьба к экспертам посмотреть, что может быть не так: прогоняю разные примеры (закоменчены в main) и всегда получаю корректный результат.
При этом на пункт "Все слова переданные в метод getLine должны быть включены в результирующую строку."
Получаю такой ответ валидатора: "Протестируй свое решение на примере из условия - все слова должны быть выведены на экран."
Возможно, есть еще какие-то тест-кейсы, которые помогут найти проблему.
Да, решение не оптимально по скорости, но, пока, не могу убедить валидатор, что оно рабочее)
package com.javarush.task.task22.task2209;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) throws IOException {
//...
BufferedReader fileNameReader = new BufferedReader(new InputStreamReader(System.in));
String fileName = fileNameReader.readLine();
BufferedReader fileReader = new BufferedReader(new FileReader(fileName));
StringBuilder inputString = new StringBuilder();
while (fileReader.ready()) {
inputString.append(fileReader.readLine()+" ");
}
// inputString.append("test sum num kill sims mate even dad android eye kick elephant drink alpha eels bee mob linea tea apple alpha elephant kick linea android eels kill sum eye spud drink even bee dad num tea test sims apple mob mate test sum num kill sims mate even dad android eye kick elephant drink alpha eels bee mob linea tea apple test sum num kill sims mate even dad android eye kick elephant drink alpha eels bee mob linea tea apple");
// inputString.append("Витебск Ачинск Кострома Ковров Ковров Киров Анапа Артемск Воскресенск");
// inputString.append("Дербент Якутск Арзамас Рог Киев Кувшиново Капустин-Яр Стокгольм Флоренция Глен-Хоп Тобольск Нью-Йорк Афины Муром Осташков Прага Кострома Вена Амстердам Мельбурн Волгоград Минск");
// inputString.append("Кино Америка Велосипед Ацетон Кирпич Самолет Орео Носорог Орео Горб Яблоня Орео Чебурег Бензин Брок Оса Нос Яблоня Ябеда Динар Америка Яблоня Аврал Лев Орео Великан Арка Улей Герб Сон Короб Нерв Революция Блок Нота Арес Табу");
// inputString.append("Венеция Киров Киев ялтА астрахань ьыбурГ гомель Ьтаун Нью-Йорк Калининград Душанбе Ереван норильсК курсК");
// inputString.append("МОСКВА АМСТЕРДАМ");
// inputString.append("Мельбурн Токио Москва Ростов-на-Дону Киев Нью-Йорк Ухань Канберра Вашингтон Дедовск Калининград Душанбе Ереван Амстердам Вена Норильск Ленинград Кыштым Адлер Комсомольск Архангельск Иркутск Нью-Джерси Николаев Орёл Кронштадт Красноярск");
// inputString.trimToSize();
StringBuilder result = getLine(inputString.toString().trim());
System.out.println(result);
}
public static StringBuilder getLine(String... words) {
if (words.length == 0) return new StringBuilder();
StringBuilder sortedString = new StringBuilder();
List<String> uncheckedStringSet = new ArrayList<>();
String wordStr = Arrays.toString(words);
wordStr = wordStr.substring(1,wordStr.length()-1);
String[] wordsArray = wordStr.split(" ");
if ((wordsArray.length == 0)||(wordsArray[0].equals("null"))){
return sortedString;
}
uncheckedStringSet.addAll(Arrays.asList(wordsArray));
String currentWord = "";
for (String str : wordStr.split(" ")) {
if(hasNextElement(str,uncheckedStringSet)){
currentWord = str;
uncheckedStringSet.remove(currentWord);
sortedString.append(currentWord);
break;
}
}
while(uncheckedStringSet.size() > 0){
List<String> forIteration = new ArrayList<>(uncheckedStringSet);
String finalStr = currentWord;
for (String str : forIteration.stream().filter((p)-> p.toLowerCase().charAt(0) == finalStr.toLowerCase().charAt(finalStr.length() - 1)).collect(Collectors.toList())) {
if ((uncheckedStringSet.contains(str))&&(hasNextElement(str,uncheckedStringSet))) {
uncheckedStringSet.remove(str);
sortedString.append(" " + str);
currentWord = str;
break;
}
}
}
return sortedString;
}
public static boolean hasNextElement(String checkingWord,List<String> stringsList) {
List<String> stringsListInner = new ArrayList<>(stringsList);
if (stringsListInner.size() == 1){
return true;
}
boolean hasFoundElement = false;
stringsListInner.remove(checkingWord);
for (String str : stringsListInner.stream().filter((p) -> p.toLowerCase().charAt(0) == checkingWord.toLowerCase().charAt(checkingWord.length() - 1)).collect(Collectors.toList())) {
if (hasNextElement(str,stringsListInner)) {
hasFoundElement = true;
break;
}
}
return hasFoundElement;
}
}