Правильно ли я сравниваю строки лексикографически?

Я создаю метод compareTo(AltString altStr2), который сортирует строки по их длине (от самых коротких до самых длинных).

Однако я бы хотел приложить дополнительные усилия и проверить, есть ли струны такой же длины. В этом случае я считаю, что лучше всего отсортировать строки лексикографически, чтобы они были отсортированы так же, как в словаре. Пока мой код ниже.

public class AltString {

    String internalStr;

      public AltString(String str) {
        internalStr = str;
      }

      public String toString() {
        return internalStr;
      }

public int compareTo(AltString altStr2) {
      if (this.internalStr.length() < altStr2.internalStr.length()) {
          return -1;
      } else if (this.internalStr.length() > altStr2.internalStr.length()) {
          return 1;
      } else {
          int idx = 0;
          while (this.internalStr.charAt(idx) != altStr2.internalStr.charAt(idx)) {
              if (this.internalStr.charAt(idx) < altStr2.internalStr.charAt(idx)) {
                  return -1;
              }else if (this.internalStr.charAt(idx) > altStr2.internalStr.charAt(idx)) {
                  return 1;
              } else {
                  idx += 1;

public static void main(String[] args) {
        // some test code for the AltString class
        String [] list = {"fortran", "java", "perl", "python", "php", "javascrip", "c", "c++", "c#", "ruby"};
        AltString [] alist = new AltString[list.length];
        for (int i=0; i<alist.length; i++) {
          alist[i] = new AltString(list[i]);
        }

        Arrays.sort(list);
        Arrays.sort(alist);
        System.out.println("String sort:");
        for (int i=0; i<list.length; i++) {
          System.out.println(list[i]);
        }

        System.out.println("\nAltString sort:");
        for (int i=0; i<alist.length; i++) {
          System.out.println(alist[i]);
        }
      }

Часть, на которой я должен остановиться, - это лексикографическое сравнение строк. В настоящее время у меня есть настройка кода, поэтому я ввожу цикл while и сравниваю каждый символ.

Мой вопрос: это наиболее эффективный способ сделать это или есть лучший способ лексикографически сравнить каждую строку в тех случаях, когда строки имеют одинаковую длину?


person Omar N    schedule 15.11.2015    source источник
comment
Вы знаете, что лексикографическая сортировка - это сортировка по умолчанию для String?   -  person Tunaki    schedule 15.11.2015
comment
Извините, что вы имеете ввиду?   -  person Omar N    schedule 15.11.2015
comment
@OmarN Тунаки означает, что в бите else вы можете просто сделать return this.internalStr.compareTo(altStr2.internalStr);.   -  person Paul Boddington    schedule 15.11.2015
comment
@PaulBoddington, я думал об этом, но разве это не рекурсия в тот момент?   -  person Omar N    schedule 15.11.2015
comment
@OmarN Нет, если только internalStr не AltString. Мы все предполагаем, что это String, но на самом деле вы этого не говорите ...   -  person Paul Boddington    schedule 15.11.2015
comment
См. compareTo метод   -  person Caffeinated    schedule 15.11.2015
comment
@OmarN - Что такое AltString? мы можем увидеть остальной код?   -  person Caffeinated    schedule 15.11.2015
comment
@PaulBoddington, понял. Я добавил остальной код.   -  person Omar N    schedule 15.11.2015
comment
Помимо использования String.compareTo (), вы также должны сравнить длины с Integer.compare ().   -  person JB Nizet    schedule 15.11.2015
comment
while ==. Также java.text.Normalizer может быть полезным, поскольку один текст Unicode может быть записан как разные строки. ĉ как одна или две кодовые точки: c плюс ^ нулевой длины. Вторая форма удобнее для сортировки,   -  person Joop Eggen    schedule 15.11.2015
comment
Всем спасибо за помощь. Думаю, главный вопрос здесь в том, считается ли добавление return this.internalStr.compareTo(altStr2.internalStr); после else рекурсией в этом случае? Я думал, что это так, и поэтому вместо этого использовал цикл while.   -  person Omar N    schedule 15.11.2015
comment
@OmarN Нет, это не рекурсия. Рекурсия - это вызов метода изнутри. Вы этого не делаете. String.compareTo отличается от метода AltString.compareTo. Просто у них одно и то же имя.   -  person Paul Boddington    schedule 15.11.2015
comment
@PaulBoddington, спасибо, Пол. Если вы добавите это в качестве ответа, я приму его. Спасибо еще раз.   -  person Omar N    schedule 15.11.2015
comment
@OmarN Готово. Я сделал это вики сообщества, так как это действительно ответ Тунаки и Дж. Б. Низета, а не мой.   -  person Paul Boddington    schedule 15.11.2015


Ответы (1)


Следуя советам Тунаки и Дж. Б. Низета, вы можете использовать Integer.compare и String.compareTo. Использование String.compareTo не считается рекурсией. Рекурсия - это когда вы вызываете метод из самого себя, но String.compareTo отличается от метода AltString.compareTo.

public int compareTo(AltString altStr2) {
    int temp = Integer.compare(this.internalStr.length(), altStr2.internalStr.length());
    return temp != 0 ? temp : this.internalStr.compareTo(altStr2.internalStr);  
}
person Community    schedule 15.11.2015