¿Por qué obtengo una falta de coincidencia de tipos al intentar invertir una cadena en Java?

Entonces, siempre fui un programador novato, pero recientemente decidí aprender Java. Solo estaba jugando con un pequeño constructor que debía tomar una cadena y luego escribirla al revés (mi método para hacer esto no se suponía que fuera eficiente de ninguna manera, simplemente estaba usando diferentes herramientas disponibles para mí para acostumbrarme .) Mi error se produjo cuando intentaba agregar un carácter en una matriz a una cadena. Este es el código:

public class dids {

    char letters[];

    public dids(String thing)
    {
        letters= new char[thing.length()];  
        for(char x:letters){
            letters[x] = thing.charAt(x);
        }
        for(int i=thing.length();i>0;i--){
            String retval += letters[i];
        }
    }
}

El error dice que no puedo agregar un carácter a una cadena. Una falta de coincidencia de tipos.

preguntado el 27 de agosto de 11 a las 23:08

Edité el título de tu pregunta para que fuera algo más descriptivo ... siéntete libre de editar de nuevo. Además, intenté incluir el "mensaje de error" de su comentario, pero debería haber copiado simplemente el mensaje de error real de su compilador en la pregunta. (El compilador ciertamente no genera I cannot add a char to a string.) -

6 Respuestas

public class dids { //classes start with an upper case letter (Dids not dids)

char letters[];

public dids(String thing)
{

letters= new char[thing.length()];  //No null check can throw NPE
for(char x:letters){ //letters is an empty array.  
    letters[x] = thing.charAt(x);  
}
for(int i=thing.length();i>0;i--){//style is to count up
    String retval += letters[i]; //retval is recreated every time

}

}

}   

desea usar String.toCharArray para completar su matriz de la siguiente manera:

letters = thing.toCharArray();

El siguiente código invierte una cadena.

StringBuilder sb = new StringBuilder(thing);  
sb = sb.reverse();  
String retval = sb.toString();

Respondido 28 ago 11, 03:08

necesitas declarar retval fuera del ciclo for:

public dids(String thing)
{

letters= new char[thing.length()];  
for(int x=0;x<letters.length;x++){//using index instead of char
    letters[x] = thing.charAt(x);
}
String retval=""
for(int i=thing.length()-1;i>=0;i--){//fixing of by one
     retval+= letters[i];

}

}

de lo contrario, se recrea y se desecha cada vez que se ejecuta el ciclo.

hubo algunos otros errores que solucioné

Respondido 28 ago 11, 03:08

Hubo varios errores en su ejemplo. He arreglado el código y lo hice funcionar mejor. El error principal fue que ha declarado la variable retval en el bucle for.

public void dids(String thing) {
    System.out.println(thing);
    char letters[];


    letters =  thing.toCharArray();
    String retval = "";
    for (int i = thing.length()-1; i >= 0; i--) {
        retval = retval + letters[i];

    }
    System.out.println(retval);

}

Respondido 28 ago 11, 03:08

En Java, lo haría más así (tenga en cuenta que esto todavía es muy desagradable, realmente solo haría algo del los comunes biblioteca, pero entiendes la idea

public class Dids {

    private String _thing;  

    private String _reversed = "";

    public Dids(String thing) {             
        _thing = thing;             
    }

    public void reverse() {         
        for(int i=_thing.length()-1 ;i>-1; i--){
            _reversed += _thing.charAt(i);
        }
    }

    public String getReversed() {
        return _reversed;
    }
}

public class ReverseTester {

    public static void main(String[] args) {    
        String test = "abcd";

        Dids dids = new Dids(test);
        dids.reverse();

        System.out.println(dids.getReversed());
    }
}

Respondido 28 ago 11, 03:08

definitivamente se llama StringBuilder - Woot4Moo

eh ¿Qué se llama StringBuilder? - eternidad

sugirió usar Apache commons, cuando la API de Java proporciona una forma de revertir un Objeto que se puede traducir en una Cadena. - Woot4Moo

ah gracias, estaba pensando en el método inverso en commons StringUtils - eternidad

Esto es un poco confuso, pero hay dos errores en ambos for loops.

En el primero usas el x como índice. x como lo definiste con char x es un char y no un int (bueno, tal vez desee echar un vistazo a la conversión de primitivas, ya que esto puede ser complicado). En el primer ciclo en cada iteración x se actualizará y contendrá el carácter 'siguiente' en el letters[].

En el segundo bucle en la primera iteración habrá una "IndexOutOfBoundException". ¡El último elemento de una matriz es igual a su longitud-1 ya que las matrices se basan en 0!

Respondido 28 ago 11, 03:08

No nos ha dicho cuál es el error.

Veo lo siguiente:

  1. for(char x:letters){
    Esta forma de for El bucle iterará sobre cada carácter en letters. Así, x se establecerá para cada carácter en letters. Sin embargo, está intentando usarlo como índice, lo cual está bastante bien ya que char puede ser lanzado a un int. Pero, dado que nunca inicializa la matriz de caracteres (letters), siempre obtendrás un valor de 0 para x. Lo que significa que siempre está configurando el primer elemento de letters, sobrescribiendo el anterior.

  2. for(int i=thing.length()....
    Dado que las matrices tienen un índice 0, la length siempre será uno más que el índice del último elemento. Por lo tanto, al acceder a la matriz con la longitud de la matriz, se sale de los límites en 1. Debe inicializar i a thing.length()-1.

  3. String retval += letters[i];
    Esto no se compila; no se puede declarar y adjuntar. retval debe declararse fuera del bucle for.


Aquí hay una solución a su código que hace uso de la toCharArray() método disponible para String objetos:

public dids(String thing)
{
    letters= thing.toCharArray();

    String retval = "";
    for(int i=thing.length()-1;i>=0;i--){
         retval += letters[i];
    }

}

Una solución un poco más eficiente podría ser:

public dids(String thing)
{
    StringBuilder sb = new StringBuilder();
    for(int i = thing.length()-1; i >=0; i-- )
    {
        sb.append(thing.charAt(i));
    }
}

Esto es mejor porque

a. StringLos s son inmutables, lo que significa que una vez creados no se pueden modificar (a menos que recurra al uso de la reflexión) y cada vez que agrega una cadena, en realidad está creando un nuevo objeto que es un desperdicio en esta situación. A StringBuilder or StringBuffer está destinado a utilizarse en un caso en el que desee realizar cambios en una secuencia de caracteres.

B. Desde un String se puede acceder carácter a carácter, en realidad no es necesario crear una representación de matriz de caracteres de la cadena para revertirla.

Respondido 28 ago 11, 03:08

Lo siento, había intentado eludirlo en la penúltima oración, pero no estaba claro. El error dice que no puedo agregar un carácter a una cadena. Una falta de coincidencia de tipos. - Diana

@Sam Por favor, vea mi respuesta actualizada: no puede declarar y agregar en la misma declaración, debe declarar retval fuera del bucle. Además, existen otros problemas con su código que harán que no funcione como espera. - no.good.at.coding

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