Jak przedstawić pusty znak w klasie znaków Java


126

Chcę przedstawić pusty znak w Javie, tak jak ""w String ...

Tak char ch = an empty character;

Właściwie chcę zamienić znak bez pozostawiania spacji.

Myślę, że wystarczy zrozumieć, co to oznacza: brak postaci, nawet przestrzeń.


2
Pokaż przykład operacji zamiany, którą chcesz wykonać.
— sudokod

1
@rahulsri Nie widzę kodu, do którego się odnosisz.
— Peter Lawrey

2
Myślę, że OP chce String.replace(' ', EMPTY_CHARACTER)mieć taki sam efekt jak String.replace(" ", ""). To znaczy usuń wszystkie spacje.
— Roland

Odpowiedzi:


134

Możesz przypisać '\u0000'(lub 0). W tym celu użyj Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;

5
Co to '\0'dokładnie znaczy? @AVD
— toast cynamonowy

8
@cinnamontoast - Jego literał zerowy char
— adatapost

11
Literał pusty znak nadal jest znakiem i zajmuje miejsce w pamięci.
— Jimmy T.

7
Pytanie dotyczy sposobu przedstawienia „braku znaków”. Chociaż znak zerowy jest przydatny w wielu sytuacjach, nadal jest znakiem sam w sobie, więc nie może być odpowiedzią na to pytanie. Prawidłowa odpowiedź, już podana przez użytkownika 3001, to użycie typu odwołania Java w ramce typu znakowego i nadanie mu wartości „null”, gdy „brak znaku” jest potrzebny.
— Chris Hatton

2
@AVD Tak, a rahulsri pyta, jak przedstawić brakujący znak. Zatem odwołanie do znaku zerowego pasuje.
— Chris Hatton,

97

charoznacza dokładnie jeden znak. Nie możesz przypisać zero znaków do tego typu.

Oznacza to, że nie ma wartości typu char, dla której String.replace(char, char)zwróciłby łańcuch o innej długości.


14
Trzy lata po fakcie ktoś w końcu udzielił poprawnej i pełnej odpowiedzi.
— Malnormalulo

To bardzo trafna odpowiedź.
— Edgar Asatryan

36

Ponieważ Character jest klasą wywodzącą się z Object, możesz przypisać wartość null jako „instancję”:

Character myChar = null;

Problem rozwiązany ;)


5
To jest poprawne rozwiązanie i powinno być akceptowaną odpowiedzią.
— Chris Hatton

2
Chociaż to nie odpowiada na OP, to właśnie tego szukałem.
— Elyess Abouda

2
NAJBARDZIEJ poprawna odpowiedź brzmi: „nie da się tego zrobić”. To jest najbliższe, jakie możesz dostać.
— Malnormalulo

2
Charakter jest, ale char nie.
— Pieter De Bie

12

Pusty łańcuch jest opakowaniem na a char[]bez elementów. Możesz mieć pusty char[]. Ale nie możesz mieć „pustki” char. Podobnie jak inne prymitywy, achar musi mieć wartość.

Mówisz, że chcesz „zastąpić znak bez pozostawiania spacji”.

Jeśli masz do czynienia z a char[], utworzyłbyś nowy char[]z usuniętym elementem.

Jeśli masz do czynienia z String, to utworzyłbyś nowyString (Ciąg jest niezmienny) z usuniętym znakiem.

Oto kilka przykładów, jak można usunąć znak:

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);

}

Oprócz rozwiązania replace (), pozostałe dwa zastąpią tylko pierwsze wystąpienie znaku, a nie wszystkie.
— sactiw

8

Ponieważ charsmożna to przedstawić jako liczby całkowite (kody ASCII), możesz po prostu napisać:

char c = 0;

0 w kodzie ASCII to null.


0 jako jednostka kodu UTF-16 ( char) jest pełnym kodowaniem UTF-16 dla punktu kodowego Unicode U + 0000. Jakiekolwiek podobieństwo do innego zestawu znaków lub kodowania znaków jest nieistotne. Java używa UTF-16.
— Tom Blodget

6

Jeśli chcesz zamienić znak w String bez pozostawiania pustego miejsca, możesz to osiągnąć za pomocą StringBuilder. Ciąg jest niezmiennym obiektem w javie, nie można go modyfikować.

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

3

Nie możesz. „” jest literałem łańcucha, który nie zawiera znaków. Nie zawiera „pustego znaku” (cokolwiek przez to rozumiesz).


3

Szukałem tego. Wystarczy ustawić char c = 0;i działa idealnie. Spróbuj.

Na przykład, jeśli próbujesz usunąć zduplikowane znaki z ciągu, jednym ze sposobów byłoby przekonwertowanie ciągu na tablicę znaków i zapisanie w zestawie skrótów znaków, co automatycznie zapobiegałoby duplikatom.

Innym sposobem będzie jednak przekonwertowanie ciągu znaków na tablicę znaków, użycie dwóch pętli for i porównanie każdego znaku z resztą tablicy ciągów / znaków (duże O w działaniu N ^ 2), a następnie dla każdego znalezionego duplikatu po prostu ustaw ten znak na 0 ..

... i użyj, new String(char[])aby przekonwertować wynikową tablicę znaków na łańcuch, a następnie sysout do wydrukowania (to wszystko jest java btw). zauważysz, że wszystkich znaków ustawionych na zero po prostu nie ma, a wszystkie duplikaty zniknęły. długi post, ale chciałem tylko podać przykład.

więc tak ustaw char c = 0;lub jeśli dla tablicy char, ustaw cArray[i]=0dla tego konkretnego zduplikowanego znaku i usuniesz go.


2

W Javie nie ma pustego literału znakowego , innymi słowy, „” nie ma znaczenia w przeciwieństwie do „”, które oznacza pusty literał String

Najbliższy sposób reprezentowania pustego literału znakowego to znak o zerowej długości [], na przykład:

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

Jeśli odwołujesz się do klasy String, jej domyślny konstruktor tworzy pustą sekwencję znaków za pomocą new char[0]

Również użycie Character.MIN_VALUE nie jest poprawne, ponieważ nie jest to tak naprawdę pusty znak, a raczej najmniejsza wartość znaku typu.

Ja też nie lubię Character c = null; rozwiązanie, ponieważ jvm wyrzuci NPE, jeśli spróbuje go rozpakować. Po drugie, null jest w zasadzie odwołaniem do żadnego typu referencyjnego wrt, a tutaj mamy do czynienia z typem pierwotnym, który nie akceptuje null jako możliwej wartości.

Zakładając, że w ciągu, powiedzmy str, OP chce zastąpić wszystkie wystąpienia znaku, powiedz „x”, pustym znakiem „”, a następnie spróbuj użyć:

str.replace("x", "");

1

tak to robię.

char[] myEmptyCharArray = "".toCharArray();

To nie jest pusta postać. Jest to tablica znaków o zerowej długości.
— Stephen C

1
char ch = Character.MIN_VALUE;

Powyższy kod zainicjuje zmienną chz minimalną wartością, jaką może mieć znak (tj \u0000.).


1

Możesz zrobić coś takiego:

mystring.replace(""+ch, "");

0

Możesz ponownie użyć tylko istniejącej postaci. Np. \0jeśli umieścisz to w String, będziesz mieć String z jednym znakiem.


Powiedz, że chcesz chartakiego, że kiedy to zrobisz

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

zamiast tego musisz zrobić

String s = 
char ch = MY_NULL_CHAR;
String s2 = ch == MY_NULL_CHAR ? s : s + ch;
assert s.equals(s2);

1
Co masz na myśli it not worked? Czy masz na myśli to, że się nie kompiluje? W takim przypadku byłoby to char ch = '\0';lubchar ch = 0;
— Peter Lawrey,

@rahulsri Wszystkie znaki są znakami i nie ma znaku, który nie byłby postacią. Musisz dowiedzieć się, jakie są Twoje rzeczywiste wymagania i spróbować rozwiązać je w inny sposób. nulPostać jest jednym z wielu znaków specjalnych, które wskazuje na jego charakter, który tak naprawdę nie ma, ale jest ono nadal charakter.
— Peter Lawrey

2
"Jeśli bóg może wszystko, czy Bóg może stworzyć skałę, której nawet nie może podnieść?" Jest podobny do pytania; Czy potrafisz stworzyć postać, która nie jest postacią?
— Peter Lawrey

0

W \bdrugim parametrze użyj operatora (operatora klawisza Escape)

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

xD ... zabawne rzeczy przyniosą skutek, jeśli spróbujesz użyć zniekształconego (tak, zniekształconego, poturbowanego, oszpeconego) ciągu jako części np. nazwy pliku.
— Scre

0

Hej, zawsze tworzę metody dla niestandardowych rzeczy, które zwykle nie są zaimplementowane w Javie. Oto prosta metoda usuwania znaków ze 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();
    }

Dla wyjaśnienia, tak, nie ma pustego znaku do zastąpienia, ale możesz usunąć znak w ten sposób. Wiem, że to stare pytanie, ale zamieszczam tę odpowiedź, ponieważ ten kod może być pomocny dla niektórych osób.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.