Como representar um caractere vazio na classe Java Character

126

Eu quero representar um caractere vazio em Java como ""em String ...

Curtiu isso char ch = an empty character;

Na verdade, quero substituir um personagem sem deixar espaço.

Eu acho que pode ser suficiente entender o que isso significa: nenhum personagem, nem mesmo o espaço.

rahulsri
fonte
2
Mostre um exemplo da operação de substituição que você deseja executar.
sudocode
1
@rahulsri Não consigo ver o código ao qual você está se referindo.
Peter Lawrey
2
Eu acho que o OP quer executar String.replace(' ', EMPTY_CHARACTER)para ter o mesmo efeito que String.replace(" ", ""). Ou seja, remova todos os espaços.
Roland

Respostas:

134

Você pode atribuir '\u0000'(ou 0). Para esse fim, use Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;
adatapost
fonte
5
O que '\0'exatamente significa? @AVD
brinde de canela
8
@cinnamontoast - É um nulo caractere literal
adatapost
11
Um literal de caractere nulo ainda é um caractere e ocupa espaço no armazenamento.
Jimmy T.
7
A pergunta pede uma maneira de representar 'sem caracteres'. Embora o caractere nulo seja útil em muitas situações, ele ainda é um personagem por si só, portanto não pode ser a resposta para esta pergunta. A resposta correta, já fornecida pelo usuário3001, é usar o tipo de referência de caracteres em caixa de Java e atribuir um valor 'nulo' quando 'nenhum caractere' for necessário.
Chris Hatton
2
@AVD Sim, e rahulsri pergunta como representar um personagem ausente. Portanto, uma referência nula de caracteres se encaixa.
31514 Chris Cornelton em
97

charsignifica exatamente um caractere. Você não pode atribuir zero caracteres a esse tipo.

Isso significa que não há um valor de char para o qual String.replace(char, char)retornaria uma string com um comprimento diferente.

Jimmy T.
fonte
14
Três anos após o fato, alguém finalmente deu uma resposta correta e completa.
Malnormalulo 16/02
Esta é uma resposta muito precisa.
Edgar Asatryan
36

Como Character é uma classe derivada de Object, você pode atribuir null como "instance":

Character myChar = null;

Problema resolvido ;)

user3001
fonte
5
Esta é uma solução correta e deve ser a resposta aceita.
Chris Hatton
2
Embora isso não responda ao OP, é o que eu estava procurando.
Elyess Abouda
2
A resposta MAIS correta é "isso não pode ser feito". Este é o mais próximo que você pode chegar.
Malnormalulo 26/01
2
Personagem é, mas char não é.
Pieter De Bie
12

Uma String vazia é um invólucro em um char[] sem elementos. Você pode ter um vazio char[]. Mas você não pode ter um "vazio" char. Como outras primitivas, a chartem que ter um valor.

Você diz que deseja "substituir um personagem sem deixar espaço".

Se você estiver lidando com um char[] , crie um novo char[]com esse elemento removido.

Se você estiver lidando com um String , crie um novo String(String é imutável) com o caractere removido.

Aqui estão alguns exemplos de como você pode remover um caractere:

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
fonte
Além da solução replace (), outros dois substituirão apenas a primeira ocorrência do personagem e não todos.
sactiw
8

Como charspode ser representado como Inteiros (códigos ASCII), você pode simplesmente escrever:

char c = 0;

O 0 no código ASCII é null.

Thomas
fonte
0 como uma unidade de código UTF-16 ( char) é a codificação UTF-16 completa para o ponto de código Unicode U + 0000. Qualquer semelhança com algum outro conjunto de caracteres ou codificação de caracteres é irrelevante. UTF-16 é o que Java usa.
precisa
6

Se você deseja substituir um caractere em uma String sem deixar espaço em branco, é possível fazer isso usando StringBuilder. String é um objeto imutável em java, você não pode modificá-lo.

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

Você não pode. "" é o literal de uma sequência que não contém caracteres. Ele não contém o "caractere vazio" (o que você quer dizer com isso).

jarnbjo
fonte
3

Eu estava procurando por isso. Basta definir o char c = 0;e ele funciona perfeitamente. Tente.

Por exemplo, se você estiver tentando remover caracteres duplicados de uma String, uma maneira seria converter a string em array de caracteres e armazenar em um hashset de caracteres que impediria automaticamente duplicatas.

Outra maneira, no entanto, será converter a string em uma matriz de caracteres, usar dois loops for e comparar cada caractere com o restante da matriz de caracteres / caracteres (uma atividade Big O em N ^ 2) e, em seguida, para cada duplicata encontrada basta definir esse caracter para 0 ..

... e use new String(char[])para converter a matriz de caracteres resultante em string e, em seguida, sysout para imprimir (isso é tudo java btw). você observará que todos os caracteres definidos como zero simplesmente não estão lá e todas as duplicatas se foram. post longo, mas só queria dar um exemplo.

então sim, defina char c = 0;ou se, para matriz de caracteres, defina cArray[i]=0esse caractere duplicado específico e você o removerá.

Meka O
fonte
2

Em java, não há nada como literal de caractere vazio ; em outras palavras, '' não tem significado diferente de "", o que significa um literal String vazio

O mais próximo que você pode representar um caractere vazio de caracteres é através de um caractere de comprimento zero [], algo como:

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

Se você se referir à classe String, o construtor padrão cria uma sequência de caracteres vazia usando new char[0]

Além disso, o uso de Character.MIN_VALUE não está correto porque não é realmente um caractere vazio, e sim o menor valor do caractere de tipo.

Também não gosto Character c = null;como solução, principalmente porque o jvm lançará o NPE se tentar desempacotá-lo. Em segundo lugar, nulo é basicamente uma referência a nada, e aqui estamos lidando com o tipo primitivo que não aceita nulo como um valor possível.

Supondo que na string, digamos str, o OP queira substituir todas as ocorrências de um caractere, diga 'x', por caractere vazio '' e tente usar:

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

é assim que eu faço.

char[] myEmptyCharArray = "".toCharArray();
dukekosy
fonte
Esse não é um personagem vazio. É uma matriz de caracteres de comprimento zero.
Stephen C
1
char ch = Character.MIN_VALUE;

O código acima inicializará a variável chcom o valor mínimo que um caractere pode ter (ou seja \u0000).

Hüseyin Burhan ÖZKAN
fonte
1

Você pode fazer algo assim:

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

Você só pode reutilizar um personagem existente. Por exemplo, \0se você colocar isso em uma String, terá uma String com um caractere.


Digamos que você queira chartal que, quando fizer isso,

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

o que você precisa fazer é

String s = 
char ch = MY_NULL_CHAR;
String s2 = ch == MY_NULL_CHAR ? s : s + ch;
assert s.equals(s2);
Peter Lawrey
fonte
1
Como assim it not worked? Você quer dizer que não compila? Nesse caso, seria char ch = '\0';ouchar ch = 0;
Peter Lawrey
@rahulsri Todos os personagens são personagens e não há nenhum personagem que não seja um personagem. Você precisa descobrir qual é o seu requisito real e tentar resolvê-lo de uma maneira diferente. O nulpersonagem é um dos muitos personagens especiais que indica que é um personagem que realmente não existe, mas ainda é um personagem.
Peter Lawrey
2
"Se Deus pode fazer alguma coisa, Deus pode criar uma rocha, mesmo que ele não possa levantar?" É semelhante à pergunta; Você pode criar um personagem que não é um personagem?
Peter Lawrey
0

Use o \boperador (o operador de escape de backspace) no 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
fonte
xD ... coisas divertidas resultarão se tentar usar uma seqüência assim mutilada (sim, mutilada, danificada, desfigurada) como parte de, por exemplo, o nome do arquivo.
Scre
0

Ei, eu sempre faço métodos para coisas personalizadas que geralmente não são implementadas em java. Aqui está um método simples que eu fiz para remover caracteres do 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 explicação, sim, não há caractere nulo para substituição, mas você pode remover caracteres como este. Sei que é uma pergunta antiga, mas estou postando esta resposta porque esse código pode ser útil para algumas pessoas.

Diljeet
fonte