java string

java - ¿Por qué mi cadena se convierte en enteros en lugar de letras después de agregar caracteres con+?



string (5)

Esta pregunta ya tiene una respuesta aquí:

Así que esta es la tarea: dada una cadena, devuelve una cadena donde para cada carácter del original, hay dos caracteres.

Y no entiendo por qué su salida son números en lugar de letras, lo intenté, ¿no funciona?

public String doubleChar(String str) { String s = ""; for(int i=0; i<str.length(); i++){ s += str.charAt(i) + str.charAt(i); } return s; }

Esperado :

doubleChar ("The") → "TThhee"

doubleChar ("AAbb") → "AAAAbbbb"

Salida:

doubleChar ("The") → "168208202"

doubleChar ("AAbb") → "130130196196"


¿Por qué da salida a enteros?

El operador + está sobrecargado en Java para realizar la concatenación de String solo para String s, no char s.

De las especificaciones de Java :

Si el tipo de cualquiera de los operandos de un operador + es Cadena, la operación es concatenación de cadena.

De lo contrario, el tipo de cada uno de los operandos del operador + debe ser convertible (§5.1.8) a un tipo numérico primitivo, o se produce un error en tiempo de compilación.

En su caso, char se convierte a su valor primitivo (int), luego se agrega.

En su lugar, use StringBuilder.append(char) para concatenarlos en una String .

Si el rendimiento no es una preocupación, incluso podría hacer:

char c = ''A''; String s = "" + c + c;

y s += "" + c + c;

Eso forzará al operador de concatenación de + String porque comienza con una String (""). La especificación de Java anterior explica con ejemplos:

El operador + es sintácticamente asociativo a la izquierda, independientemente de si el análisis de tipo determina que representa la concatenación de cadenas o la suma numérica. En algunos casos se requiere cuidado para obtener el resultado deseado. Por ejemplo [...]

1 + 2 + " fiddlers" es "3 fiddlers"

pero el resultado de:

"fiddlers " + 1 + 2 es "fiddlers 12"


En Java, el tipo primitivo de caracteres es básicamente un valor numérico que se asigna a un carácter, por lo tanto, si sumas dos valores de caracteres, se genera un número y no otro char (y no una String ), por lo que terminas con un int como re viendo

Para solucionar este problema, puede utilizar el método Character.toString(char) siguiente manera:

s += Character.toString(str.charAt(i)) + Character.toString(str.charAt(i))

Pero todo esto es bastante ineficiente porque estás haciendo esto en un bucle y, por lo tanto, la concatenación de cadenas está produciendo una gran cantidad de objetos de String innecesariamente. Más eficiente es usar un StringBuilder y su método de append(char) como este:

StringBuilder sb = new StringBuilder(str.length() * 2); for (int i = 0; i < str.length(); ++i) { char c = str.charAt(i); sb.append(c).append(c); } return sb.toString();


Usted está agregando el valor de dos caracteres juntos. Cambiar la concatenación de String desde:

s += str.charAt(i) + str.charAt(i);

A:

s += str.charAt(i) + "" + str.charAt(i);

Lo que asegurará que los personajes se conviertan en una String .

Nota: esta es una solución rápida, y debe usar StringBuilder cuando la String concatene dentro de un bucle. Vea las otras respuestas para saber cómo se hace esto.


Usted está agregando valores numéricos de caracteres primero antes de concatenar el resultado (ahora entero) a la cadena. Intenta depurar con sentencias impresas:

public static String doubleChar(String str) { String s = ""; for (int i = 0; i < str.length(); i++) { System.out.println(str.charAt(i)); System.out.println(str.charAt(i) + str.charAt(i)); s += str.charAt(i) + str.charAt(i); } return s; }

La forma más eficiente de hacer lo que quieres es:

public static String doubleChar(String str) { StringBuilder sb = new StringBuilder(str.length() * 2); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); sb.append(c).append(c); } return sb.toString(); }


String.charAt() devuelve un char ( https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int) ) por lo que está tratando con un solo carácter. Con un char , puede realizar operaciones en este como este (que imprimirá "65" que es un valor ASCII para el carácter ''A''):

System.out.println(''A'' + 0);

puede imprimir el valor ASCII para el siguiente carácter ("B") agregando 1 a ''A'' , así:

System.out.println(''A'' + 1);

Para que su código funcione, de modo que duplique cada carácter, hay varias opciones. Podrías añadir cada personaje uno a la vez:

s += str.charAt(i); s += str.charAt(i);

o varias formas de convertir la operación en una cadena:

s += "" + str.charAt(i) + str.charAt(i);