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.