Сравните Array of Strings и верните самый маленький - PullRequest
0 голосов
/ 28 сентября 2018

Я реализую код для сравнения Array из Strings и возвращаю наименьший код, используя stringONE.compareTo(stringTwo).

Код будет использовать рекурсию для чередования через Array вместо цикла for.

  • Я реализовал код так, чтобы метод сравнения продолжал вызывать себя с различными параметрами, пока не достигнет конца Array, тогда обработка исключений выйдет из рекурсии.

    проблема в том, что: он продолжает повторяться, пока не достигнет переполнения стека, не вызывая outofboundsException.

ниже мой код, затем вы можете проверить:

код:

public class recursivefindMinimum {
    public static String [] stringArray = {"delta","alpha","omega","zeta"};
    public static String result;

    public static void main (String[]args) {
        System.out.println("result :  "+findMinimum(stringArray, 0, 1));
    }

    public static String findMinimum(String[] stringArray, int index1, int index2) {
        int number = stringArray[index1].compareTo(stringArray[index2]);

        if (number< 0) {
            findMinimum(stringArray,index1,index2++); zebobi="delta1";
        }
        else if (number> 0) {
            findMinimum(stringArray,index2,index2++);zebobi="delta2";
        }
        else if (number== 0) {
            findMinimum(stringArray,index1,index2++);zebobi="delta3";
        }
    } catch(Exception e) {
        System.out.println(index1);
        System.out.println(index2);
        result= stringArray[index1]

        return result;
    }
}

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вот еще одно возможное решение, которое позволит избежать этих проблем с индексами:

public static String findMinimumRecursive(String[] array, String currentMinString){
  if(array.length == 0)
    return currentMinString;

  return findMinimumRecursive(
              Arrays.copyOfRange(array, 1, array.length), 
              ((Integer)currentMinString.length()).compareTo(array[0].length()) < 0 ? currentMinString : array[0]);
}

Затем можно вызвать эту функцию следующим образом:

String[] arr = {"abc", "abcd", "ab", "abe"};
String result = findMinimumRecursive(Arrays.copyOfRange(arr, 1, arr.length), arr[0]);

Эта функция будет оценивать текущую минимальную длинустрока с первым элементом массива, и каждый раз он будет вызывать себя с одним и тем же массивом с удаленным оцениваемым элементом и с текущей минимальной строкой.Условие остановки: входной массив пуст, где он просто возвращает текущую строку минимальной длины, которая соответствует минимальной длине всей строки массива

Тогда вызовы будут выглядеть так:

  1. findMinimumRecursivly (["abcd", "ab", "abe"], "abc")
  2. findMinimumRecursivly (["ab", "abe"], "abc")
  3. findMinimumRecursivly (["abe"], "ab")
  4. findMinimumRecursivly (["abe"], "a")
  5. findMinimumRecursivly ([], "a")

Обратите внимание, что метод Arrays.copyOfRange создает массив с теми же элементами, что и 1-й аргумент, но только из индекса начала и конца для 2-го и 3-го параметра - см. https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#copyOfRange(T[],%20int,%20int)

0 голосов
/ 28 сентября 2018

В рекурсии у вас всегда должен быть базовый случай, который является точкой, где вы останавливаете рекурсию.На данный момент у вас есть рекурсивные случаи для каждого возможного результата:

if (number< 0){
     findMinimum(stringArray,index1,index2++); zebobi="delta1";
}
else if (number> 0){
     findMinimum(stringArray,index2,index2++);zebobi="delta2";
}
else if (number== 0){
     findMinimum(stringArray,index1,index2++);zebobi="delta3";
}

(когда number меньше, больше или равно нулю), поэтому ваш метод всегда будет вызывать сам себя, что бесконечнорекурсии.Вам нужно включить базовый регистр, который остановит рекурсию

Также, вероятно, было бы лучше сделать result переменной, объявленной только в области действия findMinimum().Затем вам нужно изменить рекурсивные вызовы на result = findMinimum(...)

Базовый случай для этой проблемы - когда одна из переменных индекса выйдет за пределы.

public static String findMinimum(String[] stringArray, int index1, int index2) 
{
    String result = "";
    if(index1 > stringArray.length || index2 > stringArray.length-1) {
        return stringArray[index2-1];
    }

    int number = stringArray[index1].compareTo(stringArray[index2]);


    if (number< 0){
        result = findMinimum(stringArray,index1,index2+1); zebobi="delta1";
    }
    else if (number> 0){
        result = findMinimum(stringArray,index2,index2+1);zebobi="delta2";
    }
    else if (number== 0){
        result = findMinimum(stringArray,index1,index2+1);zebobi="delta3";
    }

    return result;
 }

Если вы пытаетесь вызвать исключение и затем вернуться из блока исключений:

-Вы должны добавить блок try (вы не можете иметьловить без попытки

Выход:

result :  zeta
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...