Comment représenter un caractère vide dans la classe de caractères Java

126

Je veux représenter un caractère vide en Java comme ""dans String ...

Comme ça char ch = an empty character;

En fait, je veux remplacer un personnage sans laisser d'espace.

Je pense qu'il pourrait être suffisant de comprendre ce que cela signifie: pas de caractère pas même d'espace.

rahulsri
la source
2
Montrez un exemple de l'opération de remplacement que vous souhaitez effectuer.
sudocode
1
@rahulsri Je ne vois pas le code auquel vous faites référence.
Peter Lawrey
2
Je pense que OP veut effectuer String.replace(' ', EMPTY_CHARACTER)pour avoir le même effet que String.replace(" ", ""). Ie supprimer tous les espaces.
Roland

Réponses:

134

Vous pouvez attribuer '\u0000'(ou 0). Pour cela, utilisez Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;
adatapost
la source
5
Que signifie '\0'exactement? @AVD
toast à la cannelle
8
@cinnamontoast - C'est un littéral de caractère nul
adatapost
11
Un littéral de caractère nul est toujours un caractère et prend de la place dans le stockage.
Jimmy T.
7
La question demande un moyen de représenter «pas de caractères». Bien que le caractère nul soit utile dans de nombreuses situations, il s'agit toujours d'un caractère à part entière, il ne peut donc pas être la réponse à cette question. La bonne réponse, déjà donnée par user3001, est d'utiliser le type de référence Caractère encadré de Java et de lui donner la valeur «null» lorsque «aucun caractère» n'est nécessaire.
Chris Hatton
2
@AVD Oui, et rahulsri demande comment représenter un personnage manquant. Donc, une référence de caractère nulle convient.
Chris Hatton
97

charsignifie exactement un caractère. Vous ne pouvez pas attribuer aucun caractère à ce type.

Cela signifie qu'il n'y a pas de valeur char pour laquelle String.replace(char, char)retournerait une chaîne avec une longueur différente.

Jimmy T.
la source
14
Trois ans après les faits, quelqu'un a finalement donné une réponse correcte et complète.
Malnormalulo
C'est une réponse très précise.
Edgar Asatryan le
36

Comme Character est une classe dérivée d'Object, vous pouvez affecter null comme "instance":

Character myChar = null;

Problème résolu ;)

user3001
la source
5
C'est une solution correcte et devrait être la réponse acceptée.
Chris Hatton
2
Bien que cela ne réponde pas à l'OP, c'est ce que je recherchais.
Elyess Abouda
2
La réponse la PLUS correcte est "cela ne peut pas être fait". C'est le plus proche que vous puissiez obtenir.
Malnormalulo
2
Le caractère est, mais pas le char.
Pieter De Bie
12

Une chaîne vide est un wrapper sur un char[]sans éléments. Vous pouvez avoir un vide char[]. Mais vous ne pouvez pas avoir un "vide" char. Comme les autres primitives, chara doit avoir une valeur.

Vous dites que vous souhaitez "remplacer un caractère sans laisser d'espace".

Si vous avez affaire à un char[], vous en créeriez un nouveau char[]avec cet élément supprimé.

Si vous avez affaire à un String, vous créez alors un nouveau String(String est immuable) avec le caractère supprimé.

Voici quelques exemples de la façon dont vous pouvez supprimer un caractère:

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
la source
En dehors de la solution replace (), deux autres remplaceront uniquement la première occurrence du caractère et pas tout.
sactiw
8

Comme cela charspeut être représenté par des entiers (codes ASCII), vous pouvez simplement écrire:

char c = 0;

Le 0 en code ASCII est null.

Thomas
la source
0 en tant qu'unité de code UTF-16 ( char) est le codage UTF-16 complet pour le point de code Unicode U + 0000. Toute similitude avec un autre jeu de caractères ou encodage de caractères n'est pas pertinente. UTF-16 est ce que Java utilise.
Tom Blodget
6

Si vous souhaitez remplacer un caractère dans une chaîne sans laisser d'espace vide, vous pouvez y parvenir en utilisant StringBuilder. La chaîne est un objet immuable en java, vous ne pouvez pas le modifier.

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

Vous ne pouvez pas. "" est le littéral d'une chaîne, qui ne contient aucun caractère. Il ne contient pas le "caractère vide" (quoi que vous entendiez par là).

Jarnbjo
la source
3

Je cherchais ceci. Réglez simplement le char c = 0;et cela fonctionne parfaitement. Essayez-le.

Par exemple, si vous essayez de supprimer les caractères en double d'une chaîne, une façon serait de convertir la chaîne en tableau de caractères et de la stocker dans un jeu de hachage de caractères qui empêcherait automatiquement les doublons.

Une autre façon, cependant, sera de convertir la chaîne en un tableau de caractères, d'utiliser deux boucles for et de comparer chaque caractère avec le reste du tableau de chaînes / caractères (une activité Big O sur N ^ 2), puis pour chaque doublon trouvé il suffit de mettre ce caractère à 0 ..

...et utilise new String(char[]) pour convertir le tableau de caractères résultant en chaîne, puis sysout pour imprimer (tout cela est java btw). vous observerez que tous les caractères mis à zéro ne sont tout simplement pas là et tous les doublons ont disparu. long post, mais je voulais juste vous donner un exemple.

donc oui défini char c = 0;ou si pour tableau de caractères, défini cArray[i]=0pour ce caractère dupliqué spécifique et vous l'aurez supprimé.

Meka O
la source
2

En java, il n'y a rien de littéral de caractère vide , en d'autres termes, '' n'a pas de sens contrairement à "" qui signifie un littéral de chaîne vide

Le plus proche que vous pouvez faire pour représenter un littéral de caractère vide est par le biais de char [] de longueur nulle, quelque chose comme:

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

Si vous faites référence à la classe String, son constructeur par défaut crée une séquence de caractères vide en utilisant new char[0]

De plus, l'utilisation de Character.MIN_VALUE n'est pas correcte car ce n'est pas vraiment un caractère vide mais plutôt la plus petite valeur de type caractère.

Je n'aime pas non plus comme Character c = null;solution principalement parce que jvm lancera NPE s'il essaie de le décompresser. Deuxièmement, null est fondamentalement une référence à rien du type de référence et ici nous avons affaire à un type primitif qui n'accepte pas null comme valeur possible.

En supposant que dans la chaîne, disons str, OP veut remplacer toutes les occurrences d'un caractère, disons 'x', par le caractère vide '', puis essayez d'utiliser:

str.replace("x", "");
sactiw
la source
1

c'est comme ça que je fais.

char[] myEmptyCharArray = "".toCharArray();
dukekosy
la source
Ce n'est pas un personnage vide. Il s'agit d'un tableau de caractères de longueur nulle.
Stephen C
1
char ch = Character.MIN_VALUE;

Le code ci-dessus initialisera la variable chavec la valeur minimale qu'un caractère peut avoir (c'est-à-dire \u0000).

Hüseyin Burhan ÖZKAN
la source
1

Vous pouvez faire quelque chose comme ceci:

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

Vous ne pouvez réutiliser qu'un personnage existant. Par exemple, \0si vous mettez ceci dans une chaîne, vous aurez une chaîne avec un caractère.


Dis que tu veux un chartel que quand tu le fais

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

ce que vous devez faire à la place est

String s = 
char ch = MY_NULL_CHAR;
String s2 = ch == MY_NULL_CHAR ? s : s + ch;
assert s.equals(s2);
Peter Lawrey
la source
1
Que voulez-vous dire it not worked? Voulez-vous dire qu'il ne compile pas? Dans ce cas, ce serait char ch = '\0';ouchar ch = 0;
Peter Lawrey
@rahulsri Tous les caractères sont des caractères et il n'y a aucun caractère qui ne soit un caractère. Vous devez déterminer quelle est votre véritable exigence et essayer de la résoudre d'une manière différente. Le nulcaractère est l'un des nombreux caractères spéciaux qui indique que c'est un caractère qui n'est pas vraiment là, mais il est lui-même toujours un caractère.
Peter Lawrey
2
"Si Dieu peut faire quelque chose, Dieu peut-il créer un rocher même s'il ne peut pas le soulever?" C'est similaire à la question; Pouvez-vous créer un personnage qui n'est pas un personnage?
Peter Lawrey
0

Utilisez l' \bopérateur (l'opérateur d'échappement de retour arrière) dans le deuxième paramètre

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
la source
xD ... il en résultera des choses amusantes si vous essayez d'utiliser une chaîne ainsi mutilée (oui, mutilée, mutilée, défigurée) dans le cadre d'un nom de fichier par exemple.
Scre
0

Hé, je crée toujours des méthodes pour des trucs personnalisés qui ne sont généralement pas implémentés en java. Voici une méthode simple que j'ai faite pour supprimer un caractère 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();
    }

Pour des explications, oui, il n'y a pas de caractère nul à remplacer, mais vous pouvez supprimer un caractère comme celui-ci. Je sais que c'est une vieille question, mais je poste cette réponse parce que ce code peut être utile pour certaines personnes.

Diljeet
la source