Эта часть кода будет сниться в кошмарах java кодеров :>
Как это оптимизировать или сократить?
Или есть другие варианты получения строки диагонали справа вниз с учётом границ для непересечения диагоналей?
Помогите пожалуйста разобраться!
Вот часть этого кода:
//#####################################################################################
String diagOne = "";
for (int k = height; k >= -height; k--) {
String diag = "";
for (int j = 0; j < length - k; j++) {
int i = k + j;
if (i > length || i > height || i < 0) break;
if (i < height && j < length && i >= 0 && j >= 0) {
diagOne += chCrossword[j][i];
diag += chCrossword[i][j];
}
}
if (k != 0)
diagOne += diag;
diag = "";
}
diagOne = diagOne.replaceAll(brd + brd + brd, brd);
diagOne = diagOne.replaceAll(brd + brd, brd);
diagOne = diagOne.replaceAll(brd, endSymb);
diagOne = diagOne.substring(1, diagOne.lastIndexOf(endSymb));
//#####################################################################################
package com.javarush.task.task20.task2027;
import java.util.*;
import java.io.*;
/*
Кроссворд
*/
public class Solution {
public static void main(String[] args) throws Exception {
int[][] crossword = new int[][] {
{'f', 'd', 'e', 'r', 'l', 'k'},
{'u', 's', 'a', 'm', 'e', 'o'},
{'l', 'n', 'g', 'r', 'o', 'v'},
{'m', 'l', 'p', 'r', 'r', 'h'},
{'p', 'o', 'e', 'e', 'j', 'j'}
};
detectAllWords(crossword, "home", "same");
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
// НАЧАЛО
public static List<Word> detectAllWords(int[][] crossword, String... words) throws Exception {
List<Word> list = new ArrayList<>();
for (String str : words) {
list.add(new Word(str)); // Слова
}
int height = crossword.length + 2; // 5 + 2
int length = crossword[0].length + 2; // 6 + 2
char[][] chCrossword = new char[height][length];
char border = '@';
String endSymb = "#";
String brd = border + "";
String lineH = "";
String lineV = "";
//#####################################################################################
for (int i = 0; i < height; i++) {
for (int j = 0; j < length; j++) {
if ((i > 0) && (j > 0) && (i < height - 1) && (j < length - 1)) {
chCrossword[i][j] = (char) crossword[i - 1][j - 1];
lineH += chCrossword[i][j];
if (((j + 2) % length == 0) && (i != (height - 2))) {
lineH += endSymb;
}
} else {
chCrossword[i][j] = border;
}
} // ГОРИЗОНТАЛЬНАЯ + РАСШИРЕНИЕ МАССИВА
}
//#####################################################################################
for (int i = 1; i < length - 1; i++) {
for (int j = 1; j < height - 1; j++) {
lineV += chCrossword[j][i];
if (((j + 2) % height == 0) && (i != (length - 2))) {
lineV += endSymb;
}
} // ВЕРТИКАЛЬНАЯ
}
//#####################################################################################
String diagOne = "";
for (int k = height; k >= -height; k--) {
String diag = "";
for (int j = 0; j < length - k; j++) {
int i = k + j;
if (i > length || i > height || i < 0) break;
if (i < height && j < length && i >= 0 && j >= 0) {
diagOne += chCrossword[j][i];
diag += chCrossword[i][j];
}
}
if (k != 0)
diagOne += diag;
diag = "";
}
diagOne = diagOne.replaceAll(brd + brd + brd, brd);
diagOne = diagOne.replaceAll(brd + brd, brd);
diagOne = diagOne.replaceAll(brd, endSymb);
diagOne = diagOne.substring(1, diagOne.lastIndexOf(endSymb));
//#####################################################################################
String revLineH = reverse(lineH);
String revLineV = reverse(lineV);
//#####################################################################################
print(lineH);
print(revLineH);
print(lineV);
print(revLineV);
print(diagOne);
return null;
}
// КОНЕЦ
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 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);
}
}
public static String reverse(String str) throws Exception {
String result = "";
char[] ch = str.toCharArray();
for (int i = ch.length - 1; i >= 0; i--) {
result += ch[i];
}
return result;
}
public static void print(String str) {
System.out.println(str);
}
}