Если вы хотите посчитать количество отношений соседства, вы можете:
private int countNeighborRelations(int[][] array, int yourX) {
int neighborRelationCount = 0;
for (int y = 0; y < array.length; y++) {
for (int x = 0; x < array[y].length - 1; x++) {
if (array[y][x] == yourX && array[y][x + 1] == yourX) {
neighborRelationCount += 2;
}
}
}
for (int y = 0; y < array.length - 1; y++) {
for (int x = 0; x < array[y].length; x++) {
if (array[y][x] == yourX && array[y + 1][x] == yourX) {
neighborRelationCount += 2;
}
}
}
return neighborRelationCount;
}
Если вы хотите посчитать, сколько из ваших X имеет neigbourHoodRelations (другими словами, все X имеют хотя бы одного соседа) Вы можете использовать следующий код:
private int countNeighbors(int[][] array, int yourX) {
int[][] neighborRelationCount = new int[array.length][array[0].length];
for (int y = 0; y < array.length; y++) {
for (int x = 0; x < array[y].length - 1; x++) {
if (array[y][x] == yourX && array[y][x + 1] == yourX) {
neighborRelationCount[y][x]++;
neighborRelationCount[y][x + 1]++;
}
}
}
for (int y = 0; y < array.length - 1; y++) {
for (int x = 0; x < array[y].length; x++) {
if (array[y][x] == yourX && array[y + 1][x] == yourX) {
neighborRelationCount[y][x]++;
neighborRelationCount[y + 1][x]++;
}
}
}
int neighbourCount=0;
for (int y = 0; y < neighborRelationCount.length; y++) {
for (int x = 0; x < neighborRelationCount[y].length; x++) {
if (0<neighborRelationCount[y][x]) {
neighbourCount++;
}
}
}
return neighbourCount;
}
Конечно, есть более простые решения, если вы используете другой формат данных, но с примитивом int [] [] я думаю, это самый простой способ.
Вот как я тестировал функциональность:
@Test
public void testRelations() {
// TODO Auto-generated method stub
int[][] room0_0 = { { 1, 0, 1 }, { 0, 1, 0 }, { 1, 0, 1 } };
int[][] room2_2 = { { 1, 1, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
int[][] room4_3 = { { 1, 1, 0 }, { 0, 1, 0 }, { 0, 0, 0 } };
int[][] room4_4 = { { 1, 1, 0 }, { 0, 0, 0 }, { 0, 1, 1 } };
int[][] room8_5 = { { 1, 1, 0 }, { 0, 1, 0 }, { 0, 1, 1 } };
int[][] room24_9 = { { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 } };
assertTrue(countNeighborRelations(room0_0, 1)==0);
assertTrue(countNeighborRelations(room2_2, 1)==2);
assertTrue(countNeighborRelations(room4_3, 1)==4);
assertTrue(countNeighborRelations(room4_4, 1)==4);
assertTrue(countNeighborRelations(room8_5, 1)==8);
assertTrue(countNeighborRelations(room24_9, 1)==24);
assertTrue(countNeighbors(room0_0, 1)==0);
assertTrue(countNeighbors(room2_2, 1)==2);
assertTrue(countNeighbors(room4_3, 1)==3);
assertTrue(countNeighbors(room4_4, 1)==4);
assertTrue(countNeighbors(room8_5, 1)==5);
assertTrue(countNeighbors(room24_9, 1)==9);
}
EDIT добавил полные реализации для полной запрашиваемой функциональности
Следующий код имеет сложность O (gridSize) ^ 2)
private int neigbours(Collection<CoordinatedObject> cos,int gridSize) {
boolean[][] array=new boolean[gridSize][gridSize];
for(CoordinatedObject co:cos) {
array[co.getX()][co.getY()]&=true;
}
boolean[][] neighborRelations = new boolean[array.length][array[0].length];
for (int y = 0; y < array.length; y++) {
for (int x = 0; x < array[y].length - 1; x++) {
if (array[y][x] && array[y][x + 1]) {
neighborRelations[y][x]&=true;
neighborRelations[y][x + 1]&=true;
}
}
}
for (int y = 0; y < array.length - 1; y++) {
for (int x = 0; x < array[y].length; x++) {
if (array[y][x] && array[y + 1][x]) {
neighborRelations[y][x]&=true;
neighborRelations[y + 1][x]&=true;
}
}
}
int neighbourCount=0;
for (int y = 0; y < neighborRelations.length; y++) {
for (int x = 0; x < neighborRelations[y].length; x++) {
if (neighborRelations[y][x]) {
neighbourCount++;
}
}
}
return neighbourCount;
}