¿Escribir un método recursivo para comparar dos cadenas? [duplicar]

Posible duplicado:
Uso de la recursividad para comparar cadenas para determinar cuál viene primero alfabéticamente Java

Estoy atascado en este problema de recursión para ordenar alfabéticamente dos cadenas. Aquí está la firma del método:

int compareTo(String s1, String s2)

produce:

returnval <0 significa s1 < s2

returnval ==0 significa s1 == s2

returnval >0 significa s1 > s2

Aquí está el código que tengo:

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));
    }
  }

gracias

preguntado el 03 de mayo de 12 a las 18:05

@AmitBhargava - Acabo de agregar mi código, gracias -

¿Hay algún problema con tu código? ¿Qué tiene de malo? -

¿Cuál debería ser el valor de compareTo("","Hello World") ¿ser? -

@LouisWasserman: ¿te parece bien? -

No debería ser public static void main(String[] args) (Desaparecido static) -

2 Respuestas

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

Esto está incompleto, ¿y si ambos están vacíos? ¿Y si s2 está vacío?

contestado el 03 de mayo de 12 a las 18:05

buen punto AKJ, sí OP necesita verificar eso a fondo - Cafeinado

ok, lo cambié a: ` (s1.length() == 0) || (s2.longitud() == 0)` - Ikechukwu Okechukwu Jr.

@IkechukwuOkechukwuJr Esto sigue siendo incorrecto. Debería tener una condición como esta: if(s1.length()==0 && s2.length()==0) return 0; de lo contrario si (s1.longitud()==0 && s2.longitud()>0) devuelve -1; de lo contrario, si (s1.longitud()>0 && s2.longitud==0) devuelve 1; - Guillermo Polet

Prueba esto:

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
    }
}

contestado el 03 de mayo de 12 a las 18:05

Solo para tu información, en lugar de s1.substring(1, s1.length()) simplemente escribe s1.substring(1). Es equivalente y mucho más simple de leer. - Guillermo Polet

Su for-loop es innecesario ya que saldrá después de su primera iteración con el return declaración. Solo usa s1.charAt(0) y s2.charAt(0) y elimine el bucle for. - Guillermo Polet

Gracias por los consejos @guillaume-polet - cadizm

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.