Последний пункт валидатор не пропускает. Помогите разобраться что к чему!
package com.javarush.task.task20.task2027;
import java.util.ArrayList;
import java.util.List;
/*
Кроссворд
*/
public class test {
public static void main(String[] args) {
int[][] crossword = new int[][]{
//0 1 2 3 4 5 6
{'f', 'd', 'e', 'r', 'l', 'k', 'u'},//0
// {'u', 's', 'a', 'm', 'e', 'o', 'n'},//1
// {'l', 'n', 'g', 'r', 'o', 'v', 's'},//2
// {'m', 'l', 'p', 'e', 'r', 'h', 't'},//3
// {'p', 'o', 'e', 'z', 'j', 'j', 'y'},//4
// {'p', 'o', 'e', 'e', 'j', 'j', 'l'},//5
// {'p', 'o', 'e', 'e', 'j', 'j', 'i'},//6
// {'p', 'o', 'e', 'u', 'j', 'j', 's'},//7
// {'p', 'o', 'e', 'q', 's', 'j', 'h'},//8
// {'p', 'o', 'e', 's', 'j', 'j', 'k'},//9
};
List<Word> result = new ArrayList<>();
result = detectAllWords(crossword, "erl", "squeeze", "stylish", "unstylish", "lleejj", "jjeell", "qsj", "edf");
//detectAllWords(crossword, "erv", "oore");
for (Word s: result) System.out.println(s.toString());
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
String[] stroki = null;
String[] stolbcy = null;
// диагонали слева напрваво
String[] diagonal1 = null; //вдоль строки
String[] diagonal2 = null; // вдоль столбца
// диагонали справа - налево
String[] diagonal3 = null; // вдоль строки
String[] diagonal4 = null; // вдоль столбца
if (crossword.length>1) stolbcy = new String[crossword[0].length];
if (crossword[0].length>1) stroki = new String[crossword.length];
if (crossword.length>1 && crossword[0].length>1) {
if (crossword.length > 1) diagonal1 = new String[crossword[0].length - 1];
if (crossword.length > 2) diagonal2 = new String[crossword.length - 2];
if (crossword.length > 1) diagonal3 = new String[crossword[0].length - 1];
if (crossword.length > 2) diagonal4 = new String[crossword.length - 2];
}
String[] slova = words.clone();
if (stroki != null) {
for (int i = 0; i < stroki.length; i++) stroki[i] = "";
// заполнение строк
for (int i = 0; i < stroki.length; i++) {
for (int j = 0; j < crossword[0].length; j++) {
stroki[i] += (char) crossword[i][j];
}
}
}
if (stolbcy != null){
for (int i = 0; i < stolbcy.length; i++) stolbcy[i] = "";
// заполнение столбцов
for (int i = 0; i < stolbcy.length; i++) {
for (int j = 0; j < crossword.length; j++) {
stolbcy[i] += (char) crossword[j][i];
}
}
}
if (diagonal1 != null){
for (int i = 0; i < diagonal1.length; i++) diagonal1[i] = "";
// заполнение диагонали 1
for (int i = 0; i < diagonal1.length; i++) {
for (int j = 0; j < crossword.length; j++) {
if(i+j >= crossword[0].length) break;
diagonal1[i] +=(char) crossword[j][i+j];
}
}
}
if (diagonal2 != null){
for (int i = 0; i < diagonal2.length; i++) diagonal2[i] = "";
// заполнение диагонали 2
for (int i = 0; i < diagonal2.length; i++) {
for (int j = 1; j < crossword.length; j++) {
if(i+j >= crossword.length || i+j >= crossword[0].length) break;
diagonal2[i] += (char)crossword[i+j][j-1];
}
}
}
if (diagonal3 != null){
for (int i = 0; i < diagonal3.length; i++) diagonal3[i] = "";
// заполнение диагонали 3
for (int i = 0; i < diagonal3.length; i++) {
for (int j = 0; j < crossword.length; j++) {
if(i+1-j <0 ) break;
diagonal3[i] +=(char) crossword[j][i+1-j];
}
}
}
if (diagonal4 != null){
for (int i = 0; i < diagonal4.length; i++) diagonal4[i] = "";
// заполнение диагонали 4
for (int i = 0; i < diagonal4.length; i++) {
for (int j = 1; j < crossword.length; j++) {
if(i+j >= crossword.length || i+j >= crossword[0].length) break;
diagonal4[i] += (char)crossword[i+j][crossword[0].length-j];
}
}
}
List<Word> result = new ArrayList<>();
for (int i = 0; i < slova.length; i++) {
StringBuffer stringBufferWord = new StringBuffer(slova[i]);
if (stroki != null){
searhWord(stroki,slova[i], false,true, result);
if(slova[i].length()<2) break;
}
if (stolbcy != null) {
searhWord(stolbcy,slova[i], false,false, result);
if(slova[i].length()<2) break;
}
if (diagonal1 != null) searhWordDiagonal(diagonal1, slova[i],false, true, false, crossword[0].length-1, result);
if (diagonal2 != null)searhWordDiagonal(diagonal2, slova[i],false, true, true, crossword[0].length-1, result);
if (diagonal3 != null)searhWordDiagonal(diagonal3, slova[i],false, false, false, crossword[0].length-1, result);
if (diagonal4 != null)searhWordDiagonal(diagonal4, slova[i],false, false, true, crossword[0].length-1, result);
if(!stringBufferWord.toString().equals(stringBufferWord.reverse().toString())) {
if (stroki != null)searhWord(stroki, slova[i], true, true, result);
if (stolbcy != null)searhWord(stolbcy, slova[i], true, false, result);
if (diagonal1 != null)searhWordDiagonal(diagonal1, slova[i], true, true, false, crossword[0].length - 1, result);
if (diagonal2 != null)searhWordDiagonal(diagonal2, slova[i], true, true, true, crossword[0].length - 1, result);
if (diagonal3 != null)searhWordDiagonal(diagonal3, slova[i], true, false, false, crossword[0].length - 1, result);
if (diagonal4 != null)searhWordDiagonal(diagonal4, slova[i], true, false, true, crossword[0].length - 1, result);
}
}
System.out.println(result.size());
return result;
}
public static boolean searhWord (String[] buffer, String word, boolean isReverse, boolean isStroka, List<Word> result){
StringBuffer stringBufferWord = new StringBuffer(word);
if(isReverse) stringBufferWord = stringBufferWord.reverse();
int startX,startY,endX,endY;
for (int i = 0; i < buffer.length; i++) {
if(buffer[i].contains(stringBufferWord.toString())){
int begin = buffer[i].indexOf(stringBufferWord.toString());
int end = buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1;
if(isStroka){
startX = isReverse ? end : begin;
startY = i ;
endX = isReverse ? begin : end;
endY = i;
}
else {
startX = i;
startY = isReverse ? end : begin ;
endX = i;
endY = isReverse ? begin : end;
}
// result.add(new Word(word, startX, startY,endX, endY));
result.add(new Word(word));
result.get(result.size()-1).setStartPoint(startX,startY);
result.get(result.size()-1).setEndPoint(endX,endY);
return true;
}
}
return false;
}
public static boolean searhWordDiagonal (String[] buffer, String word, boolean isReverse, boolean isRight, boolean isAdded, int lenght, List<Word> result){
StringBuffer stringBufferWord = new StringBuffer(word);
if(isReverse) stringBufferWord = stringBufferWord.reverse();
int startX,startY,endX,endY;
for (int i = 0; i < buffer.length; i++) {
if(buffer[i].contains(stringBufferWord.toString())){
if(!isAdded){
startY = !isReverse ? buffer[i].indexOf(stringBufferWord.toString()) : buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1;
endY = isReverse ? buffer[i].indexOf(stringBufferWord.toString()) : buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1;
}
else{
startY = !isReverse ? buffer[i].indexOf(stringBufferWord.toString()) + 1 + i : buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length() + i;
endY = isReverse ? buffer[i].indexOf(stringBufferWord.toString()) + 1 + i : buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length() + i;
}
if(isRight){
startX = !isReverse ? buffer[i].indexOf(stringBufferWord.toString()) : buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1;
endX = isReverse ? buffer[i].indexOf(stringBufferWord.toString()) : buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1;
if(!isAdded) {
startX +=i;
endX +=i;
}
}
else{
startX = !isReverse ? -(buffer[i].indexOf(stringBufferWord.toString())) : -(buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1);
endX = isReverse ? -(buffer[i].indexOf(stringBufferWord.toString())) : -(buffer[i].indexOf(stringBufferWord.toString())+stringBufferWord.length()-1);
if(!isAdded) {
startX +=i+1;
endX +=i+1;
}
else{
startX +=lenght;
endX +=lenght;
}
}
// result.add(new Word(word, startX, startY,endX, endY));
result.add(new Word(word));
result.get(result.size()-1).setStartPoint(startX,startY);
result.get(result.size()-1).setEndPoint(endX,endY);
return true;
}
}
return false;
}
public static class Word {
private String text;
private int startX;
private int startY;
private int endX;
private int endY;
public Word(String text) {
this.text = text;
}
// public Word(String text,int startX, int startY, int endX, int endY) {
// this.text = text;
// this.startX = startX;
// this.startY = startY;
// this.endX = endX;
// this.endY = endY;
// }
public void setStartPoint(int i, int j) {
startX = i;
startY = j;
}
public void setEndPoint(int i, int j) {
endX = i;
endY = j;
}
@Override
public String toString() {
return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
}
}
}