Добрый день, коллеги!
По условию задачи необходимо написать метод, который принимает массив int и сдвигает все ненулевые элементы массива влево, а нулевые элементы переносит вправо. Также, если хотя бы один элемент был передвинут, метод возвращает true, иначе – false.
Я реализовал метод следующим образом:
private boolean compressRow(int[] row) {
boolean isShift = false;
for (int i = 0; i < row.length; i++) {
if(row[i] == 0 && i != row.length-1) {
for(int j = i+1; j < row.length; j++) {
if(row[j] != 0) {
int temp = row[j];
row[j] = row[i];
row[i] = temp;
isShift = true;
}
}
}
}
return isShift;
}
Проверил его со следующими вариантами входных данных:
int[] array1 = {0, 2, 0, 2};
int[] array2 = {2, 0, 2, 2};
int[] array3 = {4, 4, 0, 2};
int[] array4 = {4, 2, 16, 0};
int[] array5 = {0, 0, 0, 0};
int[] array6 = {2, 4, 8, 32};
В результате метод ненулевые значения переносит влево, нулевые вправо, если была хотя бы одна перестановка возвращает true, иначе false.
Я понимаю, что реализация не самая оптимальная, но она, на мой взгляд, соответствует условию задачи.
Подскажите, пожалуйста, что я упустил?
Заранее благодарю!
package com.javarush.task.jdk13.task53.task5301;
import com.javarush.engine.cell.*;
public class Game2048 extends Game {
private static final int SIDE = 4;
private int[][] gameField = new int[SIDE][SIDE];
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
drawScene();
}
private void createGame() {
createNewNumber();
createNewNumber();
}
private void drawScene() {
for (int y = 0; y < SIDE; y++) {
for (int x = 0; x < SIDE; x++) {
setCellColoredNumber(x, y, gameField[y][x]);
}
}
}
private void createNewNumber() {
int x = getRandomNumber(0, SIDE);
int y = getRandomNumber(0, SIDE);
while(gameField[y][x] != 0) {
x = getRandomNumber(SIDE);
y = getRandomNumber(SIDE);
}
int valueCell = getRandomNumber(10);
if(valueCell == 9) {
gameField[y][x] = 4;
}
else if(valueCell >= 0 && valueCell <= 8) {
gameField[y][x] = 2;
}
}
private void setCellColoredNumber(int x, int y, int valueCell) {
if(valueCell == 0) {
setCellValueEx(x, y, getColorByValue(valueCell), "");
}
else {
setCellValueEx(x, y, getColorByValue(valueCell), String.valueOf(valueCell));
}
}
private Color getColorByValue(int valueCell) {
switch(valueCell) {
case 0 : return Color.BEIGE;
case 2 : return Color.PINK;
case 4 : return Color.BLUEVIOLET;
case 8 : return Color.AQUA;
case 16 : return Color.AQUAMARINE;
case 32 : return Color.GREENYELLOW;
case 64 : return Color.GREEN;
case 128 : return Color.WHEAT;
case 512 : return Color.BROWN;
case 1024 : return Color.DEEPPINK;
case 2048 : return Color.PURPLE;
default: return Color.NONE;
}
}
public void setCellValueEx(int x, int y, Color cellColor, String valueCell) {
setCellColor(x, y, cellColor);
setCellValue(x, y, valueCell);
}
private boolean compressRow(int[] row) {
boolean isShift = false;
for (int i = 0; i < SIDE; i++) {
if(row[i] == 0 && i != SIDE-1) {
for(int j = i+1; j < SIDE; j++) {
if(row[j] != 0) {
int temp = row[j];
row[j] = row[i];
row[i] = temp;
isShift = true;
}
}
}
}
return isShift;
}
}