Проблема с рекурсивным методом

284
03 марта 2018, 20:03

Суть задачи состоит в том чтобы убрать из массива строк соседние элементы указывающие в противоположных направлениях (South-North, East-West), и это исключение должно повторяться пока не останется таких пар. Проблема в том что программа при вводных данных ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"], должна вывести ["WEST"], но в последнем шаге после проверки if что-то происходит и к уже готовому массиву добавляется 2 пустых значения в начале и вывод становится ["","","WEST"]. Хотя в отладчике до последнего момента все как надо. Почему так происходит?

public class Test{
public static void main(String[] args) {
    Task task = new Task();
    System.out.println(Arrays.toString(task.dirReduc(new String[]{"NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"})));
   }
}

class Task {
public static String[] dirReduc(String[] arr) {
    char c,b;
    int count = 0;
   /*Цикл проверяет на наличие двух "противоположных" соседей и
   меняет строки на пустые в случае такого совпадения.*/
    for(int i = 0; i<arr.length-1;i++){
        c = arr[i].charAt(0);
        b = arr[i+1].charAt(0);
        if((c=='S'&&b=='N')||(c=='N'&&b=='S')) {arr[i] = ""; arr[i+1] = ""; i = i+2; count++;}
        else if((c=='W'&&b=='E')||(c=='E'&&b=='W')) {arr[i] = ""; arr[i+1] = ""; i = i+2; count++;}
    }
   /*Создается List в который происходит копирование всех не пустых строк и из него
копируется в новый массив который либо возвращается как ответ либо происходит рекурсивный вызов самого метода.*/
    List<String> list = new ArrayList<>();
    for(String y: arr) {if(y.length()>1) list.add(y);}
    String[] arr2 = list.toArray(new String[0]);
   //Если произошло изменение и длина больше 1 то повторить.
    if(count>0&&arr2.length>1){dirReduc(arr2);}
    return arr2;
}
Answer 1
 if (count > 0 && arr2.length > 1) {return dirReduc(arr2);}

Нужно добавить return

И i = i+2;, for тоже инкрементирует, в итоге +3 получается

Answer 2
if(count>0&&arr2.length>1){dirReduc(arr2);}

Не мешало бы использовать значение, возвращаемое dirReduc:

if (count > 0 && arr2.length > 1)
{
  arr2 = dirReduc(arr2);
}
READ ALSO
Правильно-ли реализована агрегация?

Правильно-ли реализована агрегация?

Правильно-ли я создал агрегацию? В методе main я передаю значения как class Sim, так class Battery и вызываю метод printА могу ли я так передать их, но через...

271
Не работает переключатель для radio

Не работает переключатель для radio

Приветствую, товарищи! Есть вот такая разметка:

267
CKEditor 4 fileUploadResponse получить созданную ссылку

CKEditor 4 fileUploadResponse получить созданную ссылку

После отправки файла на сервер в редакторе генерируется ссылка(из данных которые вернулись)Как можно получить доступ к этой ссылке, что бы установить...

260
Символ &ldquo;$&rdquo; в JavaScripty. JQuery. Как расшифровать код?

Символ “$” в JavaScripty. JQuery. Как расшифровать код?

Здравствуйте, помогите понять код, я не изучал нигде js и прочее

282