Как представить пустой символ в классе символов Java

126

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

Как это char ch = an empty character;

На самом деле я хочу заменить символ, не оставляя места.

Думаю, этого будет достаточно, чтобы понять, что это значит: ни символа, ни пробела.

rahulsri
источник
2
Покажите пример операции замены, которую вы хотите выполнить.
Sudocode
1
@rahulsri Я не вижу кода, о котором вы говорите.
Питер Лоури
3
Я думаю, что OP хочет выполнить String.replace(' ', EMPTY_CHARACTER)тот же эффект, что и String.replace(" ", ""). Т.е. удалите все пробелы.
Роланд

Ответы:

134

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

Character ch = Character.MIN_VALUE;
adatapost
источник
5
Что '\0'именно значит? @AVD
тост с корицей
8
@cinnamontoast - это литерал
символом
11
Литерал null char по-прежнему является символом и занимает место в хранилище.
Джимми Т.
7
В вопросе предлагается способ представления «без символов». Хотя нулевой символ полезен во многих ситуациях, он по-прежнему является самостоятельным символом, поэтому не может быть ответом на этот вопрос. Правильный ответ, который уже дал user3001, - использовать упакованный в Java ссылочный тип Character и присвоить ему значение «null», когда «никакой символ» не требуется.
Крис Хаттон,
2
@AVD Да, и rahulsri спрашивает, как изобразить отсутствующий символ. Так что ссылка на нулевой символ подходит.
Крис Хаттон
97

charозначает ровно один символ. Этому типу нельзя присвоить нулевые символы.

Это означает, что не существует значения char, для которого String.replace(char, char)возвращалась бы строка разной длины.

Джимми Т.
источник
14
Спустя три года кто-то наконец дал правильный и полный ответ.
Malnormalulo
Это очень точный ответ.
Эдгар Асатрян
36

Поскольку Character - это класс, производный от Object, вы можете присвоить null как "instance":

Character myChar = null;

Задача решена ;)

user3001
источник
5
Это правильное решение и должен быть принятым ответом.
Крис Хаттон
2
Хотя это не отвечает на OP, это то, что я искал.
Elyess Abouda
2
САМЫЙ правильный ответ - «это невозможно». Это самое близкое из возможных.
Malnormalulo
2
Характер есть, а вот char - нет.
Питер Де Би
12

Пустая строка - это оболочка char[]без элементов. Вы можете иметь пустой char[]. Но у вас не может быть «пустого» char. Как и другие примитивы, a charдолжно иметь значение.

Вы говорите, что хотите «заменить символ, не оставляя пробела».

Если вы имеете дело с a char[], вы должны создать новый char[]с удаленным элементом.

Если вы имеете дело с a String, вы должны создать новый String(String is immutable) с удаленным символом.

Вот несколько примеров того, как можно удалить символ:

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
источник
Помимо решения replace (), два других заменят только первое вхождение символа, а не все.
жертву
8

Поскольку charsэто можно представить как целые числа (ASCII-коды), вы можете просто написать:

char c = 0;

0 в ASCII-коде - это null.

Томас
источник
0 как кодовая единица UTF-16 ( char) является полной кодировкой UTF-16 для кодовой точки Unicode U + 0000. Любое сходство с каким-либо другим набором символов или кодировкой символов не имеет значения. UTF-16 - это то, что использует Java.
Tom
6

Если вы хотите заменить символ в строке, не оставляя пустого места, вы можете добиться этого с помощью StringBuilder. String - это неизменяемый объект в java, вы не можете его изменять.

String str = "Hello";
StringBuilder sb = new StringBuilder(str);
sb.deleteCharAt(1); // to replace e character
user2688394
источник
3

Вы не можете. "" - это литерал для строки, не содержащей символов. Он не содержит «пустого символа» (что бы вы под этим ни подразумевали).

jarnbjo
источник
3

Я искал это. Просто установите, char c = 0;и он отлично работает. Попытайся.

Например, если вы пытаетесь удалить повторяющиеся символы из String, одним из способов было бы преобразовать строку в массив char и сохранить в хэш-наборе символов, который автоматически предотвратит дублирование.

Другой способ, однако, будет заключаться в преобразовании строки в массив символов, использовании двух циклов for и сравнении каждого символа с остальной частью массива строк / символов (большой O на активности N ^ 2), а затем для каждого найденного дубликата просто установите этот символ на 0 ..

... и используйте new String(char[])для преобразования результирующего массива char в строку, а затем sysout для печати (это все java btw). вы увидите, что все символы, установленные на ноль, просто отсутствуют, и все дубликаты исчезли. длинный пост, но просто хочу привести вам пример.

так что да, установите char c = 0;или, если для массива char, установите cArray[i]=0для этого конкретного повторяющегося символа, и вы удалите его.

Мека О
источник
2

В java нет ничего лучше пустого символьного литерала , другими словами, "" не имеет значения, в отличие от "", что означает пустой строковый литерал.

Ближе всего к представлению пустого символьного литерала можно подойти через char [] нулевой длины, что-то вроде:

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

Если вы ссылаетесь на класс String, его конструктор по умолчанию создает пустую последовательность символов, используя new char[0]

Кроме того, использование Character.MIN_VALUE неверно, потому что это не действительно пустой символ, а наименьшее значение типа character.

Мне также не нравится Character c = null;как решение, в основном потому, что jvm выдаст NPE, если попытается распаковать его. Во-вторых, null - это в основном ссылка ни на что по ссылочному типу, и здесь мы имеем дело с примитивным типом, который не принимает null как возможное значение.

Предполагая, что в строке, скажем, str, OP хочет заменить все вхождения символа, скажем 'x', пустым символом '', затем попробуйте использовать:

str.replace("x", "");
sactiw
источник
1

вот как я это делаю.

char[] myEmptyCharArray = "".toCharArray();
dukekosy
источник
Это не пустой персонаж. Это символьный массив нулевой длины.
Stephen C
1
char ch = Character.MIN_VALUE;

Приведенный выше код инициализирует переменную chминимальным значением, которое может иметь char (т \u0000. Е. ).

Хусейн Бурхан ОЗКАН
источник
1

Вы можете сделать что-то вроде этого:

mystring.replace(""+ch, "");
KayV
источник
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;
Питер Лоури
@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 ... забавные вещи получатся, если вы попытаетесь использовать таким образом искаженную (да, искалеченную, растерзанную, изуродованную) строку как часть, например, имени файла.
Scre
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();
    }

Для пояснения: да, нулевого символа для замены нет, но вы можете удалить такой символ. Я знаю, что это старый вопрос, но я отправляю этот ответ, потому что этот код может быть полезен для некоторых людей.

Diljeet
источник