Як представити порожній знак у класі символів 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.