2016-07-23 4 views
0

Здесь я читал предыдущие вопросы сравнения строк, и все они используют подход, отличный от того, который я использую. Возможно, их подход намного лучше, но я хочу получить это, используя мой подход. Я пытаюсь написать функцию, которая сравнивает две строки и выводит ту, которая сначала в алфавитном порядке, где заглавные буквы всегда считаются предшествующими строчными буквами. Метод сравнения Java Java не будет работать, поскольку он игнорирует регистр букв в алфавитном порядке.Необычное сравнение строк Java

Я помещаю цикл for внутри цикла while. Когда цикл for обнаруживает одну букву строки меньше, чем другую букву в терминах значения ASCII, она должна выйти из цикла while и не завершить цикл for, который должен произойти. Тем не менее, программа должна возвращать «cdf», но она возвращает «dbc», хотя c предшествует d в алфавите. Почему программа возвращает «dbc», а не «cdf»?

public class Alphabet { 
    public static String min_compare(String str1, String str2) { 
     int a = 0; 
     while (a == 0) { 
      for (int i = 0; i < str1.length(); i++) { 
       int b = (int) str1.charAt(i); 
       int c = (int) str2.charAt(i); 
       if (b < c) { 
        a = 1; 
       } else if (b > c) { 
        a = 2; 
       } else if ((b == c) && (i == (str1.length() - 1))) { 
        a = 1; 
       } else { 
        a = 0; 
       } 
      } 
     } 
     if (a == 2) { 
      return str2; 
     } else { 
      return str1; 
     } 
    } 

    public static void main(String[] args) { 
     String check = min_compare("dbc", "cdf"); 
     System.out.println(check); 
    } 
} 
+0

Хорошо, я задал вопрос. –

+1

Отлично, спасибо! Теперь, что вы видите, когда запускаете это через отладчик? –

+3

«Метод сравнения Java Java не будет работать, потому что он игнорирует регистр букв при алфавитном оформлении». -- Это неправда. String.compareTo [использует кодовую точку каждого символа] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#compareTo-java.lang.String-) и в «ASCII-часть» юникода, по крайней мере, все заглавные буквы относятся ко всем строчным буквам. Например, «Aaa» <«aaa». – yshavit

ответ

1
  1. Там нет необходимости для контура while; если a равно 0 после того, как цикл for завершает работу, запуск этого цикла for не приведет к другому результату и, следовательно, вызовет бесконечный цикл.

  2. Вы устанавливаете a для каждый характер str1; таким образом, конечное значение a будет определяться только последней итерацией цикла for, игнорируя то, что было раньше.

+0

Да, это не выход из цикла while. Я думал, что как только я установлю «a» на что-то другое, кроме 0, программа оставит цикл while. Я не хотел, чтобы было возможно, что «a» будет 0 в конце цикла for. Я помещаю цикл for туда, чтобы сообщить программе продолжать сравнивать символы, если предыдущие символы совпадают. Теперь я вижу, что мне нужен только цикл while и флаг. Спасибо за понимание. –

+0

Не должно 'a' быть 0, если строки одинаковы? –

1

метод CompareTo Java не будет работать, потому что она игнорирует письмо случай, когда в алфавитном порядке.

Неправильное. String.compareTo(String) определяется как приказывать строку лексически, которую javadoc описывает следующим образом:.

"Это определение лексикографического упорядочения Если две строки различны, то либо они имеют различные символы в некоторый индекс, который является допустимым индексом для обеих строк, или их длины различны, или и то, и другое. Если они имеют разные символы в одном или нескольких положениях индекса, пусть k - наименьший такой индекс, а затем строка, символ которой в позиции k имеет меньшее значение, определяемое с помощью оператора <, лексикографически предшествует другой строке. "

Если вы внимательно прочтете это, вы увидите, что оно не игнорирует случай. Кроме того, если вы посмотрите на кодовые диаграммы Unicode, вы увидите, что заглавные буквы предшествуют соответствующим строчным буквам ... по крайней мере для неактрированных букв в латинском алфавите.

Поэтому метод compareTo будет заказывать строки в соответствии с тем, что вам нужно, при условии, что вы правильно сформулировали свои требования в Вопросе.


Глядя на ваш метод, я заметил, что он не реализует стандартную int compare(String, String) подпись. Таким образом, вы не можете напрямую заменить его на compareTo.

Я также вижу ошибку: Если str2 является префиксом str1, а str1 длиннее, тогда вы получите исключение.

На самом деле, ваш метод может быть переписан (правильно), как:

public static String minCompare(String str1, String str2) { 
     return str1.compareTo(str2) > 0 ? str2 : str1; 
    } 
+0

Стивен С, ты прав! Так работает. Вы научили меня чему-то сравнивать, о котором я раньше не знал. Благодаря! Что касается ошибки, в этом случае это не произойдет, потому что я использую этот метод только для строк одинаковой длины. –

1

Вы упомянули

он должен выйти из цикла пока и не завершить цикл

Однако вы не реализовали его в своем коде. Я добавил код вложенного цикла. Надеюсь, это поможет. Спасибо.

public class Alphabet { 

    public static String min_compare(String str1, String str2) { 

     int a = 0; 

     whileloop: 
     while (a == 0) { 
      for (int i = 0; i < str1.length(); i++) { 

       int b = (int) str1.charAt(i); 
       int c = (int) str2.charAt(i); 
       if (b < c) { 
        a = 1; 
        break whileloop; 
       } else if (b > c) { 
        a = 2; 
        break whileloop; 
       } else if ((b == c) && (i == (str1.length() - 1))) { 
        a = 1; 
        break whileloop; 
       } 

       else { 

        a = 0; 

       } 
      } 

     } 

     if (a == 2) { 
      return str2; 
     } else { 
      return str1; 
     } 
    } 

    public static void main(String[] args) { 

     String check = min_compare("dbc", "cdf"); 
     System.out.println(check); 

    } 
}