Всем привет, предполагаю, что у меня здесь много лишнего, на примере проверил - вывод такой как должен, но не покидает ощущение, что можно сделать гораздо компактнее, да и валидатор не пропускает) прошу подсказки)
package com.javarush.task.task22.task2209;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
/*
Составить цепочку слов
*/
public class Solution {
//метод main()
public static void main(String[] args) throws IOException {
String[] words = readStringFromFile((readFileNameFromKeyboard())).trim().split(" ");
StringBuilder result = getLine(words);
System.out.println(result.toString());
}
//методы, которые используются в методе main()
private static String readFileNameFromKeyboard() throws IOException {
BufferedReader readerFileName = new BufferedReader(new InputStreamReader(System.in));
String result = readerFileName.readLine();
readerFileName.close();
return result;
}
private static String readStringFromFile(String fileName) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader readerFromFile = new BufferedReader(new FileReader(fileName));
while (readerFromFile.ready()) stringBuilder.append(readerFromFile.readLine()).append(" ");
readerFromFile.close();
return stringBuilder.toString();
}
public static StringBuilder getLine(String... words) {
StringBuilder stringBuilderResult = new StringBuilder();
if (words == null) return stringBuilderResult;
ArrayList<String> listOfWords = getListOfWords(words);
ArrayList<String> listOfUsedWords = new ArrayList<>();
for (String firstWord : words) {
if (!listOfUsedWords.isEmpty()) {
firstWord = getLastWord(stringBuilderResult);
}
for (String secondWord : listOfWords) {
if (getLastLetter(firstWord) == getFirstLetter(secondWord)) {
stringBuilderResult.append(firstWord).append(" ").append(secondWord).append(" ");
listOfUsedWords.add(firstWord);
listOfUsedWords.add(secondWord);
}
}
}
return removeDuplicates(stringBuilderResult);
}
//методы, которые использует getLine()
private static ArrayList<String> getListOfWords(String[] words) {
ArrayList<String> result = new ArrayList<>();
result.addAll(Arrays.asList(words));
return result;
}
private static char getLastLetter(String word) {
return word.toLowerCase().toCharArray()[word.length() - 1];
}
private static char getFirstLetter(String word) {
return word.toLowerCase().toCharArray()[0];
}
private static String getLastWord(StringBuilder allText) {
String[] tempArray = allText.toString().trim().split(" ");
return tempArray[tempArray.length - 1];
}
private static StringBuilder removeDuplicates(StringBuilder text) {
ArrayList<String> listOfWords = new ArrayList<>();
listOfWords.addAll(Arrays.asList(text.toString().split(" ")));
StringBuilder result = new StringBuilder();
for (int i = 0; i < listOfWords.size(); i++) {
if (i % 2 == 0) result.append(listOfWords.get(i)).append(" ");
}
return result;
}
}