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

1
   public static void isMatchHelper(String input, String pattern, boolean ret){
        if(pattern.length() == 0 && input.length() == 0){
            ret =  true;
        }
        else if(pattern.length() == 0){
            ret =  false;
        }
        else if(input.length() == 0){
            ret =  true;
        }
        if(pattern.length() == 0 || input.length() == 0){
                return;
        }
        else if(pattern.charAt(0) == input.charAt(0)){
                isMatchHelper(input.substring(1), pattern.substring(1), ret);
        }
        if(pattern.charAt(0) == '.'){
            isMatchHelper(input, pattern.substring(1), ret);
        }
        if(pattern.charAt(0) == '*'){
            if(pattern.length() > 1){
                int countMatches = 0;
                char compareWith = pattern.charAt(countMatches + 1);
                while( countMatches != input.length() && input.charAt(countMatches) == compareWith){
                    countMatches++;
                }
                isMatchHelper(input.substring(countMatches), pattern.substring(2), ret);
            }
            else{
                ret =  true;
            }
        }
        if(pattern.charAt(0) != input.charAt(0)){
            isMatchHelper(input, pattern.substring(1), ret);
        }

    }

Ive попробовал вход, где он вводит первый вход, а ret - true, но опять же, значение ret, когда я проверяю его, все равно false. Я знаю, что это, вероятно, связано с передачей по значению, я пытался передать Boolean Object и с помощью Boolean.FALSE или Boolean.TRUE, который не работал. Я передал логический массив с 1 параметром, и это сработало.

Мой вопрос в настоящее время более или менее концептуальен, чтобы улучшить мое понимание, я хотел бы знать, почему логическое не работает так, как планировалось. Является ли это проблемой по стоимости или что-то еще? Должен признаться, в какой-то момент я думал, что использование Boolean vs boolean может быть исправлением.

Я с нетерпением жду вашей помощи.

  • 0
    Я не думаю, что вы можете переопределить параметр, который вы передаете в функцию.
  • 0
    bool примитивен, поэтому создается копия значения параметра. Я думаю, java.lang.Boolean также не поможет, так как он неизменен, лучше всего изменить способ, которым вы написали функцию, используя возвращаемые значения вместо параметра
Показать ещё 1 комментарий
Теги:
algorithm

1 ответ

7
Лучший ответ

Поскольку это Java, вы не можете передавать параметр по ссылке.

Вместо этого просто верните значение из метода.

   public static boolean isMatchHelper(String input, String pattern) {
       boolean ret;
       .... // Rest of your code
       .... // Replace all return statements with return ret;
      return ret;
   }

Чтобы быть ясным, поскольку функция рекурсивна, вы можете изменить рекурсивные вызовы точно так же, как вы будете менять нерекурсивные вызовы:

Эта строка

isMatchHelper(input, pattern.substring(1), ret);

Становится этой строкой:

ret = isMatchHelper(input, pattern.substring(1));
  • 0
    это рекурсивная функция.
  • 0
    @ShahrukhKhan, Вы намекаете, что не можете изменить тип возврата рекурсивной функции?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню