Мой код Java для получения первой строки в алфавитном порядке с использованием рекурсии дает неправильный вывод. Нужно ли добавить вспомогательный метод? - PullRequest
0 голосов
/ 13 октября 2019

У меня проблемы с получением s1 и s2 для правильного сравнения. Если я добавлю несколько строк в мой ArrayList<String>, он, кажется, остановится после однократного запуска. Поэтому мне не хватает рекурсивного метода, чтобы помочь моему методу findMinimum.

Мне нужно предоставить код для создания класса Tester, но сейчас я просто пытаюсь создать работающую программу. Любая помощь приветствуется. Мне нужно использовать рекурсию для этого назначения, иначе я бы использовал другой маршрут.

    public class BigComp {
    // public static String s1;
    // public static String s2;

    public static void main(String[] args) {
    // String s1 = "badd"; //, "job", "any";
    // String s2 = "hat";//,"zFat","got";
    ArrayList<String> stringArray = new ArrayList<String>();
    stringArray.add("acc");
    stringArray.add("Dbc");
    stringArray.add("bac");
    // compareTo(s1,s2);
    // findMinimum(stringArray);
    System.out.println(findMinimum(stringArray));
  }

      public static int compareTo(String s1, String s2) {

    if(s1.charAt(0) < s2.charAt(0)) {
      return -1; // String s1 is alphabetically before s2
    }
    if(s1.charAt(0) > s2.charAt(0)) {
      return 1; // String s1 is alphabetically after s2
    }
    if(s1.charAt(0) == s2.charAt(0)) {
      if(s1.length()== 1 && s2.length() ==1) {
          return 0; // both strings being compared are identical
      }
      if(s1.length() == 1 && s2.length() > 1) {
          return -1; // s1 is before s2
      }
      if(s1.length() > 1 && s2.length()== 1) {
          return 1; // s2 is before s1
      }
    }
    return compareTo(s1.substring(1), s2.substring(1));

  } // end of compareTo method

    public static String findMinimum(ArrayList<String> stringArray) {

    String s1 = stringArray.get(0);
    int max = stringArray.size()-1;
    String s2 = stringArray.get(max);
    int temp = compareTo(s1, s2);

    // if(stringArray.size() == 1) {
    //     return stringArray.get(0);
    // }

    if(temp == 0) {
      stringArray.remove(max);
      return findMinimum(stringArray);
    }
    else if(temp == 1) {
      stringArray.remove(s1);
      return findMinimum(stringArray);
    }
    else {
      stringArray.remove(s2);
      return findMinimum(stringArray);
    }

  } // end findMinimum method

} // end of BigComp class

1 Ответ

0 голосов
/ 13 октября 2019

Ваш код получит java.lang.IndexOutOfBoundsException, потому что метод findMinimum не имеет аргумента для остановки рекурсии. Вы можете добавить эту строку в начале метода findMinimum:

if (stringArray.size() == 1) return stringArray.get(0);

.charAt возвращает тип символа, это означает, что они будут сравниваться по коду ASCII. Может быть, вам нужно использовать compareToIgnoreCase:

public static int compareTo(String s1, String s2) {
    return s1.compareToIgnoreCase(s2);
}
...