Все корректно работает, но валидатор не пропускает.
package com.javarush.task.task20.task2027;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/*
Кроссворд
*/
public class Solution {
public static void main(String[] args) {
int[][] crossword = new int[][] {
{'a', 'a'},
{'a', 'a'}
};
detectAllWords(crossword, "a").forEach(System.out::println);
//MatrixCoordinats mx = new MatrixCoordinats(crossword);
//mx.LEFTDIAGONALS.forEach(x -> System.out.println(x.getText()));
/*
Ожидаемый результат
home - (5, 3) - (2, 0)
same - (1, 1) - (4, 1)
*/
}
public static List<Word> detectAllWords(int[][] crossword, String... words) {
HashSet<Word> wordSet = new HashSet<>();
MatrixCoordinats mx = new MatrixCoordinats(crossword);
List<Pattern> patterns = new ArrayList<>();
List<Pattern> reversPatterns = new ArrayList<>();
for (String word : words) {
StringBuilder sb = new StringBuilder(word);
patterns.add(Pattern.compile(word));
reversPatterns.add(Pattern.compile(sb.reverse().toString()));
}
for (List<MatrixCoordinats.Line> list : mx.ALL_LINES){
for (MatrixCoordinats.Line line : list){
for (Pattern pattern : patterns){
Matcher matcher = pattern.matcher(line.getText());
while (matcher.find()) {
int end = matcher.end() - 1;
int start = matcher.start();
Word word = new Word(line.getText().substring(start, end + 1));
word.setStartPoint(mx.getX(line,list.indexOf(line), start), mx.getY(line, list.indexOf(line), start));
word.setEndPoint(mx.getX(line, list.indexOf(line), end), mx.getY(line, list.indexOf(line), end));
if(!list.contains(word))wordSet.add(word);
}
}
for (Pattern pattern : reversPatterns){
Matcher matcher = pattern.matcher(line.getText());
while (matcher.find()) {
int end = matcher.end() - 1;
int start = matcher.start();
StringBuilder sb = new StringBuilder(line.getText().substring(start, end + 1));
Word word = new Word(sb.reverse().toString());
word.setStartPoint(mx.getX(line, list.indexOf(line), end), mx.getY(line, list.indexOf(line), end));
word.setEndPoint(mx.getX(line,list.indexOf(line), start), mx.getY(line, list.indexOf(line), start));
wordSet.add(word);
}
}
}
}
wordSet = (HashSet<Word>) wordSet.stream().distinct().collect(Collectors.toSet());
List<Word> wordList = new ArrayList<>(wordSet);
return wordList;
}
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;
}
@Override
public boolean equals(Object o){
if (o == null || o.getClass() != this.getClass()) return false;
Word word = (Word) o;
if (word.startX == this.startX && word.startY == this.startY && word.endX == this.endX && word.endY == this.endY) return true;
return false;
}
@Override
public int hashCode() {
int result = startX + startY + endX + endY + text.hashCode();
return result;
}
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);
}
}
}