Всё что было связано с Нью-йорк, я исправил на Нью-Йорк и даже Нью-Нью-Нью-Йорк и тд
Программа возвращает правильный результат
Ищем от первого слова и дальше, пытаемся выравнить список, дальше проверяем его всё ли верно, если нет, то на рандом раскидываем его элементы.
package com.javarush.task.task22.task2209;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.io.*;
/*
Составить цепочку слов
*/
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String name = console.readLine();
console.close();
ArrayList<String> list = new ArrayList<>();
BufferedReader fReader = new BufferedReader(new InputStreamReader(new FileInputStream(name)));
while (fReader.ready()) {
String[] mas = fReader.readLine().split(" ");
for (String el : mas) list.add(el);
}
fReader.close();
String[] data = new String[list.size()];
for (int a = 0; a < list.size(); a++) data[a] = list.get(a);
StringBuilder result = getLine(data);
System.out.println(result.toString());
}
public static StringBuilder getLine(String... words) {
ArrayList<String> list = new ArrayList<>();
for (String el : words) list.add(el.toLowerCase());
if (list.size()==0) return new StringBuilder();
list = search(list);
boolean check = check(list);
while(!check) {
check = check(list);
if (!check) list = random(list);
}
StringBuilder builder = new StringBuilder();
int ind = 0;
for (String el : list) {
String n = (el.charAt(0)+"").toUpperCase();
el = el.replaceFirst(el.charAt(0)+"", n);
char[] mas = el.toCharArray();
for (int a = 0; a < mas.length; a++) {
if (mas[a]=='-') {
a++;
int c = mas[a]-32;
mas[a]=(char)c;
}
}
el = "";
for (int a = 0; a < mas.length; a++) el += mas[a]+"";
if (ind!=list.size()-1) builder.append(el+" ");
else builder.append(el);
ind++;
}
return builder;
}
public static ArrayList<String> search(ArrayList<String> list) {
for (int a = 0; a < list.size(); a++) {
String firstword = list.get(a);
char end = firstword.charAt(firstword.length() - 1);
for (int b = a+1; b < list.size(); b++) {
String secondword = list.get(b);
char start = secondword.charAt(0);
if (end == start) {
String copy = list.get(a+1);
list.set(a+1, secondword);
list.set(b, copy);
break;
}
}
}
return list;
}
public static boolean check(ArrayList<String> list) {
int done = 0;
for (int a = 0; a < list.size()-1; a++) {
String firstword = list.get(a);
char end = firstword.charAt(firstword.length() - 1);
String secondword = list.get(a+1);
char start = secondword.charAt(0);
if (end == start) done++;
}
if (done == list.size()-1) return true;
else return false;
}
public static ArrayList<String> random(ArrayList<String> list) {
for (int a = 0; a < 10; a++) {
int rand1 = rnd(list.size()-1);
int rand2 = rnd(list.size()-1);
String one = list.get(rand1);
list.set(rand1, list.get(rand2));
list.set(rand2, one);
}
return list;
}
public static int rnd(int max) {
return (int) (Math.random() * ++max);
}
}