2012-05-03 2 views
-2

Можно создать дубликат:
Using Recursion To Compare Strings To Determine Which Comes First Alphabetically JavaНапишите рекурсивный метод сравнения двух строк?

Я застрял на эту проблему рекурсии в алфавитном порядке сортировать любые две строки. Вот метод подписи:

int compareTo(String s1, String s2) 

это yeilds:

returnval <0 означает s1 < s2

returnval ==0 означает s1 == s2

returnval >0 означает s1 > s2

Вот код, у меня есть:

package bonushw; 

public class Recursion { 

    public void main (String[] args){ 
     Recursion recurse = new Recursion(); 
     System.out.println("value is: " + recurse.compareTo("bill","bill")); 
    } 

    public int compareTo (String s1, String s2) { 

    if(s1.length() == 0){ 
     return 0; 
    } 
    else if (s1.charAt(0) < s2.charAt(0)){ 
     return -1; 
    } 
    else if (s1.charAt(0) > s2.charAt(0)) { 
     return 1; 
    } 
    else { 
     return compareTo(s1.substring(1), s2.substring(1)); 
    } 
    } 

благодаря

+0

@AmitBhargava - Я просто добавил свой код, благодаря –

+1

Есть ли проблема с кодом? Что с этим не так? –

+0

Что должно значить значение 'compareTo (" "," Hello World ")? – emory

ответ

3
if(s1.length() == 0){ 
     return 0; 
    } 

Это является неполным, что, если оба пусты, что, если s2 пуст?

+0

хорошая точка AKJ, да OP необходимо тщательно проверить, что – Coffee

+0

ok я изменил его на: '(s1.length() == 0) || (s2.length() == 0) ' –

+3

@IkechukwuOkechukwuJr Это по-прежнему неверно. У вас должно быть такое условие: if (s1.length() == 0 && s2.length() == 0) return 0; else if (s1.length() == 0 && s2.length()> 0) return -1; else if (s1.length()> 0 && s2.length == 0) return 1; –

-1

Попробуйте это:

class Compare 
{ 
    public static int compareTo(String s1, String s2) 
    { 
     int len = s1.length() < s2.length() ? s1.length() : s2.length(); 

     if (len == 0 && s1.length() > 0) 
      return -1; 
     else if (len == 0 && s2.length() > 0) 
      return 1; 

     for (int i = 0; i < len; ++i) 
     { 
      int v1 = s1.charAt(i); 
      int v2 = s2.charAt(i); 

      if (v1 == v2) 
       return compareTo(s1.substring(1, s1.length()), 
           s2.substring(1, s2.length())); 
      else 
       return v1 - v2; 
     } 

     return 0; 
    } 

    public static void main(String[] args) 
    { 
     System.out.println(compareTo("", ""));  // 0 
     System.out.println(compareTo("a", "a"));  // 0 
     System.out.println(compareTo("ab", "a"));  // -1 
     System.out.println(compareTo("a", "ab"));  // 1 
     System.out.println(compareTo("abc", "abc")); // 0 
    } 
} 
+0

Просто FYI, вместо 's1.substring (1, s1.length())' просто напишите 's1.substring (1)'. Это эквивалентно и гораздо проще читать. –

+0

Ваш цикл for не нужен, поскольку он выйдет после его первой итерации с помощью оператора 'return'. Просто используйте 's1.charAt (0)' и 's2.charAt (0)' и удалите for-loop. –

+0

Спасибо за советы @ guillaume-polet – cadizm

Смежные вопросы