Як представити порожній знак у класі символів Java


126

Я хочу представляти порожній символ на Java, як ""у String ...

Щось схоже на те char ch = an empty character;

Насправді я хочу замінити персонажа, не залишаючи місця.

Я думаю, що може бути достатньо, щоб зрозуміти, що це означає: жоден персонаж не навіть пробіл.


2
Покажіть приклад операції заміни, яку ви хочете виконати.
sudocode

1
@rahulsri Я не можу побачити код, на який ви посилаєтесь.
Пітер Лорі

2
Я думаю, що ОП хоче виконати, String.replace(' ', EMPTY_CHARACTER)щоб мати такий же ефект, як і String.replace(" ", ""). Тобто видаліть усі пробіли.
Роланд

Відповіді:


134

Ви можете призначити '\u0000'(або 0). Для цього використовуйте Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;

5
Що '\0'саме означає? @AVD
тост з корицею


11
Нульовий літерал все ще є символом і займає місце для зберігання.
Джиммі Т.

7
Питання задає спосіб представити "немає символів". Хоча нульовий символ корисний у багатьох ситуаціях, він все ж є персонажем сам по собі, тому не може бути відповіддю на це питання. Правильна відповідь, яку вже дав user3001, полягає в тому, щоб використовувати посилальний тип символів у коробці Java та надати йому значення "null", коли "немає символу".
Кріс Хаттон

2
@AVD Так, і rahulsri запитує, як зобразити зниклого персонажа. Тож нульова посилання символу підходить.
Кріс Хаттон

97

charозначає рівно один символ. Ви не можете призначити нульовим символам цього типу.

Це означає, що немає значення char, яке String.replace(char, char)б повернуло рядок з різною довжиною.


14
Через три роки після факту хтось нарешті дав правильну і повну відповідь.
Malnormalulo

Це дуже точна відповідь.
Едгар

36

Оскільки характер є класом, що походить від Object, ви можете призначити null як "екземпляр":

Character myChar = null;

Проблема вирішена ;)


5
Це правильне рішення і має бути прийнятою відповіддю.
Кріс Хаттон

2
Хоча це не відповідає ОП, це те, що я шукав.
Elyess Abouda

2
НАЙКРАЩА правильна відповідь - "цього не можна зробити". Це найближче, що можна отримати.
Мальнормалуло

2
Характер є, але char немає.
Пітер Де Бі

12

Порожня рядок - це обгортка char[]з елементами без елементів. Можна мати порожнє char[]. Але ви не можете мати "порожній" char. Як і інші примітиви, аchar має мати значення.

Ви кажете, що хочете "замінити персонаж, не залишаючи пробілу".

Якщо ви маєте справу з a char[], ви створили б новий char[]із цим елементом.

Якщо ви маєте справу з символом String, ви створили б новий String(Рядок незмінний) із видаленим символом.

Ось кілька прикладів того, як можна було видалити картку:

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

}

Окрім рішення, що замінює (), інші два замінять лише перше виникнення символу, і не все.
sactiw

8

Оскільки це charsможе бути представлено у вигляді Цілих чисел (ASCII-коди), ви можете просто написати:

char c = 0;

0 в ASCII-коді є null.


0 як код коду UTF-16 ( char) - це повне кодування UTF-16 для кодової точки Unicode U + 0000. Будь-яка подібність з деяким іншим набором символів або кодуванням символів не має значення. UTF-16 - це те, що використовує Java.
Том Блоджет

6

Якщо ви хочете замінити символ у рядку, не залишаючи порожнього місця, ви можете досягти цього за допомогою StringBuilder. Рядок є незмінним об'єктом в java, ви не можете його змінювати.

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

3

Ви не можете. "" - це буквальний рядок для рядка, який не містить символів. Він не містить "порожнього символу" (що б ви не мали на увазі під цим).


3

Я це шукав. Просто встановіть char c = 0;і він працює чудово. Спробуй це.

Наприклад, якщо ви намагаєтесь видалити повторювані символи з рядка, одним із способів було б перетворення рядка в масив char та збереження у хеш-наборі символів, що автоматично запобігатиме дублікатам.

Інший спосіб, однак, полягає в перетворенні рядка в масив char, використанні двох for-циклів і порівняння кожного символу з рештою масиву string / char (велика активність N N 2), а потім для кожного знайденого дубліката просто встановіть цю позначку на 0 ..

... і використовувати new String(char[])для перетворення отриманого масиву char у рядок, а потім вивести сисету для друку (це все Java BTW). ви будете спостерігати за всіма знаками, встановленими на нуль, просто немає, і всі дублікати пішли. довгий пост, але просто хотів навести приклад.

так що встановити так, char c = 0;або якщо для масиву char, встановіть cArray[i]=0для цього конкретного дублюючого символу, і ви його видалили.


2

У Java немає нічого, як пусте буквене позначення символів , іншими словами, "" не має значення на відміну від "", що означає порожній рядковий ліній

Найближче представлення пустого буквеного символу - це символ нульової довжини [], щось на зразок:

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

Якщо ви посилаєтесь на клас String, його конструктор за замовчуванням створює порожню послідовність символів, використовуючи new char[0]

Крім того, використання символу.MIN_VALUE не є правильним, оскільки це насправді не порожній символ, а найменше значення символу типу.

Мені теж не подобається Character c = null; рішення, головним чином тому, що jvm кине NPE, якщо він спробує його зняти. По-друге, null - це в основному посилання на тип wrt посилання нічого wrt, і тут ми маємо справу з примітивним типом, який не сприймає null як можливе значення.

Якщо припустити, що в рядку, скажімо, str, OP хоче замінити всі входження символу, скажімо, "x", порожнім символом ", то спробуйте використовувати:

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


1
char ch = Character.MIN_VALUE;

Код, наведений вище, ініціалізує змінну chз мінімальним значенням, яке може мати знак (тобто \u0000).


1

Ви можете зробити щось подібне:

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

0

Ви можете повторно використовувати вже наявний символ. Наприклад, \0якщо ви помістите це в рядку, у вас буде рядок з одним символом.


Скажіть, що ви хочете charтакого, коли це робите

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

що ти повинен зробити замість цього

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

1
Що ти маєш на увазі it not worked? Ви маєте на увазі, що він не збирається? У цьому випадку було б char ch = '\0';абоchar ch = 0;
Пітер Lawrey

@rahulsri Усі символи є символами, і немає жодного символу, який не є персонажем. Вам потрібно розібратися, яка ваша справжня вимога, і спробувати вирішити це по-іншому. nulПерсонаж один з багатьох спеціальних символів , що вказує на його характер , який не є на насправді є, але вона сама ще характер.
Пітер Лорі

2
"Якщо бог може щось робити, чи може Бог створити скелю, навіть він не може підняти?" Це схоже на питання; Чи можете ви створити персонажа, який не є персонажем?
Пітер Лорі

0

Використовуйте \bоператора (оператора втечі з резервного простору) у другому параметрі

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 ... забавні речі вийдуть, якщо спробувати використовувати таким чином заплутану (так, розіграну, скасовану) рядок як частину, наприклад, імені файлу.
Екран

0

Гей, я завжди створюю методи для спеціальних речей, які зазвичай не реалізуються в Java. Ось простий метод, який я створив для видалення символу з 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();
    }

Для пояснення, так, немає жодного нульового символу для заміни, але ви можете видалити такий символ, як цей. Я знаю, що це давнє запитання, але я публікую цю відповідь, оскільки цей код може бути корисним для деяких людей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.