Cómo representar caracteres vacíos en la clase de caracteres Java

126

Quiero representar un carácter vacío en Java como ""en String ...

Como eso char ch = an empty character;

En realidad quiero reemplazar un personaje sin dejar espacio.

Creo que podría ser suficiente entender lo que esto significa: ningún personaje, ni siquiera el espacio.

rahulsri
fuente
2
Muestre un ejemplo de la operación de reemplazo que desea realizar.
sudocode
1
@rahulsri No puedo ver el código al que te refieres.
Peter Lawrey
2
Creo que OP quiere realizar String.replace(' ', EMPTY_CHARACTER)para tener el mismo efecto que String.replace(" ", ""). Es decir, eliminar todos los espacios.
Roland

Respuestas:

134

Puede asignar '\u0000'(o 0). Para este propósito, use Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;
Adatapost
fuente
55
¿Qué significa '\0'exactamente? @AVD
tostada de canela
8
@cinnamontoast - Es un literal de char nulo
adatapost
11
Un literal de caracteres nulo sigue siendo un carácter y ocupa espacio en el almacenamiento.
Jimmy T.
77
La pregunta pide una forma de representar 'sin caracteres'. Si bien el carácter nulo es útil en muchas situaciones, sigue siendo un carácter en sí mismo, por lo que no puede ser la respuesta a esta pregunta. La respuesta correcta, ya dada por user3001, es usar el tipo de referencia de caracteres en caja de Java y darle un valor 'nulo' cuando no se necesita 'carácter'.
Chris Hatton el
2
@AVD Sí, y rahulsri pregunta cómo representar un personaje perdido. Por lo tanto, cabe una referencia de carácter nula.
Chris Hatton
97

charsignifica exactamente un personaje. No puede asignar cero caracteres a este tipo.

Eso significa que no hay un valor de carácter para el que String.replace(char, char)se devuelva una cadena con una longitud diferente.

Jimmy T.
fuente
14
Tres años después del hecho, alguien finalmente dio una respuesta correcta y completa.
Malnormalulo
Esta es una respuesta muy precisa.
Edgar Asatryan
36

Como Character es una clase derivada de Object, puede asignar nulo como "instancia":

Character myChar = null;

Problema resuelto ;)

user3001
fuente
55
Esta es una solución correcta y debe ser la respuesta aceptada.
Chris Hatton el
2
Aunque esto no responde al OP, es lo que estaba buscando.
Elyess Abouda
2
La respuesta MÁS correcta es "no se puede hacer". Esto es lo más cercano que puede llegar.
Malnormalulo
2
El personaje es, pero Char no lo es.
Pieter De Bie
12

Una cadena vacía es un contenedor en un char[]sin elementos. Puedes tener un vacío char[]. Pero no puedes tener un "vacío" char. Al igual que otras primitivas, a chartiene que tener un valor.

Dices que quieres "reemplazar un personaje sin dejar un espacio".

Si está tratando con un char[], entonces crearía uno nuevo char[]con ese elemento eliminado.

Si está tratando con un String, entonces crearía un nuevo String(String es inmutable) con el carácter eliminado.

Aquí hay algunas muestras de cómo puedes eliminar un char:

public static void main(String[] args) throws Exception {

    String s = "abcdefg";
    int index = s.indexOf('d');

    // delete a char from a char[]
    char[] array = s.toCharArray();
    char[] tmp = new char[array.length-1];
    System.arraycopy(array, 0, tmp, 0, index);
    System.arraycopy(array, index+1, tmp, index, tmp.length-index);
    System.err.println(new String(tmp));

    // delete a char from a String using replace
    String s1 = s.replace("d", "");
    System.err.println(s1);

    // delete a char from a String using StringBuilder
    StringBuilder sb = new StringBuilder(s);
    sb.deleteCharAt(index);
    s1 = sb.toString();
    System.err.println(s1);

}
sudocode
fuente
Además de la solución replace (), otros dos reemplazarán solo la primera aparición del personaje y no todos.
sactiw
8

Como charsse puede representar como enteros (códigos ASCII), simplemente puede escribir:

char c = 0;

El 0 en el código ASCII es null.

Thomas
fuente
0 como una unidad de código UTF-16 ( char) es la codificación completa UTF-16 para el punto de código Unicode U + 0000. Cualquier similitud con algún otro conjunto de caracteres o codificación de caracteres es irrelevante. UTF-16 es lo que usa Java.
Tom Blodget
6

Si desea reemplazar un carácter en una Cadena sin dejar ningún espacio vacío, puede hacerlo utilizando StringBuilder. La cadena es un objeto inmutable en Java, no puede modificarlo.

String str = "Hello";
StringBuilder sb = new StringBuilder(str);
sb.deleteCharAt(1); // to replace e character
usuario2688394
fuente
3

No puedes "" es el literal de una cadena, que no contiene caracteres. No contiene el "carácter vacío" (lo que quiera decir con eso).

jarnbjo
fuente
3

Yo estaba buscando esto. Simplemente configure el char c = 0;y funciona perfectamente. Intentalo.

Por ejemplo, si está tratando de eliminar caracteres duplicados de una Cadena, una forma sería convertir la cadena en una matriz de caracteres y almacenarla en un hashset de caracteres que evitaría automáticamente duplicados.

Sin embargo, otra forma será convertir la cadena en una matriz de caracteres, usar dos bucles for y comparar cada carácter con el resto de la matriz de cadenas / caracteres (una gran O en la actividad N ^ 2), luego para cada duplicado encontrado solo pon ese char a 0 ..

... y se usa new String(char[])para convertir la matriz de caracteres resultante en una cadena y luego en sysout para imprimir (todo esto es java por cierto). observará que todos los caracteres configurados en cero simplemente no están allí y todos los duplicados se han ido. publicación larga, pero solo quería darte un ejemplo.

así que sí, char c = 0;o si es para una matriz de caracteres, configúrelo cArray[i]=0para ese carácter duplicado específico y lo habrá eliminado.

Meka O
fuente
2

En java no hay nada como literal de caracteres vacío , en otras palabras, '' no tiene ningún significado a diferencia de "", que significa un literal de cadena vacío

Lo más cercano que puede hacer para representar caracteres literales vacíos es a través de char de longitud cero [], algo así como:

char[] cArr = {};         // cArr is a zero length array
char[] cArr = new char[0] // this does the same

Si hace referencia a la clase String, su constructor predeterminado crea una secuencia de caracteres vacía utilizando new char[0]

Además, el uso de Character.MIN_VALUE no es correcto porque no es realmente un carácter vacío, sino el valor más pequeño del carácter de tipo.

Tampoco me gusta Character c = null;como solución principalmente porque jvm arrojará NPE si intenta desempaquetarlo. En segundo lugar, nulo es básicamente una referencia a nada tipo de referencia wrt y aquí estamos tratando con un tipo primitivo que no acepta nulo como un posible valor.

Suponiendo que en la cadena, digamos str, OP quiere reemplazar todas las apariciones de un carácter, diga 'x', con un carácter vacío '', luego intente usar:

str.replace("x", "");
sactiw
fuente
1

Así es como lo hago.

char[] myEmptyCharArray = "".toCharArray();
dukekosy
fuente
Ese no es un personaje vacío. Es una matriz de caracteres de longitud cero.
Stephen C
1
char ch = Character.MIN_VALUE;

El código anterior inicializará la variable chcon el valor mínimo que puede tener un carácter (es decir \u0000).

Hüseyin Burhan ÖZKAN
fuente
1

Puedes hacer algo como esto:

mystring.replace(""+ch, "");
KayV
fuente
0

Solo puedes reutilizar un personaje existente. por ejemplo, \0si pones esto en una cadena, tendrás una cadena con un carácter.


Digamos que quieres un chartal que cuando lo haces

String s = 
char ch = ?
String s2 = s + ch; // there is not char which does this.
assert s.equals(s2);

lo que tienes que hacer es

String s = 
char ch = MY_NULL_CHAR;
String s2 = ch == MY_NULL_CHAR ? s : s + ch;
assert s.equals(s2);
Peter Lawrey
fuente
1
¿Qué quiere decir it not worked? ¿Quieres decir que no se compila? En ese caso sería char ch = '\0';ochar ch = 0;
Peter Lawrey
@rahulsri Todos los personajes son personajes y no hay ningún personaje que no sea un personaje. Debe determinar cuál es su requerimiento real e intentar resolverlo de una manera diferente. El nulpersonaje es uno de los muchos caracteres especiales que indica que es un personaje que realmente no está allí, pero en sí mismo sigue siendo un personaje.
Peter Lawrey
2
"Si Dios puede hacer algo, ¿puede Dios crear una roca que él no pueda levantar?" Es similar a la pregunta; ¿Puedes crear un personaje que no sea un personaje?
Peter Lawrey
0

Use el \boperador (el operador de escape de retroceso) en el segundo parámetro

String test= "Anna Banana";

System.out.println(test); //returns Anna Banana<br><br>
System.out.println(test.replaceAll(" ","\b")); //returns AnnaBanana removing all the spaces in the string
Kevin Silva
fuente
xD ... resultarán cosas divertidas si se trata de usar una cadena así destrozada (sí, destrozada, mutilada, desfigurada) como parte de, por ejemplo, el nombre del archivo.
Scre
0

Hola, siempre hago métodos para cosas personalizadas que generalmente no se implementan en Java. Aquí hay un método simple que hice para eliminar caracteres de String Fast

    public static String removeChar(String str, char c){
        StringBuilder strNew=new StringBuilder(str.length());
        char charRead;
        for(int i=0;i<str.length();i++){
            charRead=str.charAt(i);
            if(charRead!=c)
                strNew.append(charRead);
        }
        return strNew.toString();
    }

Para explicación, sí, no hay caracteres nulos para reemplazar, pero puede eliminar caracteres como este. Sé que es una pregunta antigua, pero estoy publicando esta respuesta porque este código puede ser útil para algunas personas.

Diljeet
fuente