Как удалить один символ из строки


128

Для доступа к отдельным символам строки в Java у нас есть String.charAt(2). Есть ли встроенная функция для удаления отдельного символа строки в java?

Что-то вроде этого:

if(String.charAt(1) == String.charAt(2){
   //I want to remove the individual character at index 2. 
}

3
Можете ли вы опубликовать реальный пример, где вы хотите это сделать?
Рохит Джайн

У вас есть заменить, а не удалить. Возможно, вам придется написать свой собственный.
kosa

Вы можете сделать это с coupleиз substringи indexOf. Но это создаст новый строковый объект.
Rohit Jain

StringBuilder - это класс чтения / записи для управления символами. Вы можете создать его из String и использовать sb.toString () для получения результирующей String.
Aubin

Ответы:


228

Вы также можете использовать StringBuilderизменяемый класс.

StringBuilder sb = new StringBuilder(inputString);

У него есть метод deleteCharAt(), наряду со многими другими методами мутатора.

Просто удалите символы, которые вам нужно удалить, и получите следующий результат:

String resultString = sb.toString();

Это позволяет избежать создания ненужных строковых объектов.


похоже, ваш ответ здесь не работает ... String numbers = "0123456789"; char c = '2'; numbers = numbers.replace(c, Character.MIN_VALUE); Я хочу заменить символ '' (пустой)
Сураджит Бисвас

73

Одна возможность:

String result = str.substring(0, index) + str.substring(index+1);

Обратите внимание, что результатом является новая строка (а также два промежуточных объекта String), потому что строки в Java неизменяемы.


63

Вы можете использовать метод Java String под названием replace, который заменит все символы, соответствующие первому параметру, вторым параметром:

String a = "Cool";
a = a.replace("o","");

15

Нет, потому что строки в Java неизменяемы. Вам нужно будет создать новую строку, удалив символ, который вам не нужен.

Чтобы заменить один символ cв позиции индекса idxв строке str, сделайте что-нибудь вроде этого и помните, что будет создана новая строка:

String newstr = str.substring(0, idx) + str.substring(idx + 1);

1
-1: для адресации отдельного символа replaceAll не подходит. Вы не отвечаете на вопрос.
Aubin

1
@Aubin Я обновил свой ответ на замену отдельного символа, не могли бы пересмотреть свой голос против?
Оскар Лопес

Для адресации отдельного символа INDEXED replace () не подходит. Вы не отвечаете на вопрос (перечитайте его). Я не могу снова проголосовать против ...
Обен

1
@Aubin перечитал вторую часть моего ответа, касающуюся этого случая, как и заданный вопрос, теперь как насчет удаления отрицательного голоса? ответ правильный, он просто учитывает один случай, дополнительный к тому, который задан в вопросе.
Оскар Лопес

7
Ваш ответ теперь полностью другой: вы сначала заменили replaceAll () на replace (), а затем заменили replace () на substring (). Теперь это дословная копия atkretsch, которая так же быстро и правильно ответила на вопрос. Ваш ответ больше ничего не добавляет. Удалите, пожалуйста.
Aubin

14
String str = "M1y java8 Progr5am";

deleteCharAt ()

StringBuilder build = new StringBuilder(str);
System.out.println("Pre Builder : " + build);
    build.deleteCharAt(1);  // Shift the positions front.
    build.deleteCharAt(8-1);
    build.deleteCharAt(15-2);
System.out.println("Post Builder : " + build);

заменить ()

StringBuffer buffer = new StringBuffer(str);
    buffer.replace(1, 2, ""); // Shift the positions front.
    buffer.replace(7, 8, "");
    buffer.replace(13, 14, "");
System.out.println("Buffer : "+buffer);

символ []

char[] c = str.toCharArray();
String new_Str = "";
    for (int i = 0; i < c.length; i++) {
        if (!(i == 1 || i == 8 || i == 15)) 
            new_Str += c[i];
    }
System.out.println("Char Array : "+new_Str);

8

Рассмотрим следующий код:

public String removeChar(String str, Integer n) {
    String front = str.substring(0, n);
    String back = str.substring(n+1, str.length());
    return front + back;
}

4

Вы также можете использовать (огромную) машину регулярных выражений.

inputString = inputString.replaceFirst("(?s)(.{2}).(.*)", "$1$2");
  • "(?s)" - сообщает regexp обрабатывать новые строки как обычные символы (на всякий случай).
  • "(.{2})" - группа $ 1 собирает ровно 2 персонажа
  • "." - любой символ с индексом 2 (выдавить).
  • "(.*)" - группа $ 2, которая собирает остальную часть inputString.
  • "$1$2" - объединение группы $ 1 и группы $ 2.

3

Чтобы изменить строки, прочитайте о StringBuilder, потому что он изменяемый, за исключением неизменяемого String. Здесь можно найти различные операции https://docs.oracle.com/javase/tutorial/java/data/buffers.html . Приведенный ниже фрагмент кода создает StringBuilder, а затем добавляет данную String, а затем удаляет первый символ из String, а затем преобразует его обратно из StringBuilder в String.

StringBuilder sb = new StringBuilder();

sb.append(str);
sb.deleteCharAt(0);
str = sb.toString();

1

Используйте функцию replaceFirst класса String. Существует так много вариантов функции замены, которые вы можете использовать.


1

Если вам нужен некоторый логический контроль над удалением символов, используйте это

String string = "sdsdsd";
char[] arr = string.toCharArray();
// Run loop or whatever you need
String ss = new String(arr);

Если вам не нужен такой контроль, вы можете использовать то, что упомянул Оскар или Бхеш. Они на месте.



1

Самый простой способ удалить символ из строки

String str="welcome";
str=str.replaceFirst(String.valueOf(str.charAt(2)),"");//'l' will replace with "" 
System.out.println(str);//output: wecome

1
public class RemoveCharFromString {
    public static void main(String[] args) {
        String output = remove("Hello", 'l');
        System.out.println(output);
    }

    private static String remove(String input, char c) {

        if (input == null || input.length() <= 1)
            return input;
        char[] inputArray = input.toCharArray();
        char[] outputArray = new char[inputArray.length];
        int outputArrayIndex = 0;
        for (int i = 0; i < inputArray.length; i++) {
            char p = inputArray[i];
            if (p != c) {
                outputArray[outputArrayIndex] = p;
                outputArrayIndex++;
            }

        }
        return new String(outputArray, 0, outputArrayIndex);

    }
}

1

В большинстве случаев использование StringBuilderили substringявляется хорошим подходом (как уже было сказано). Однако для кода, критичного к производительности, это может быть хорошей альтернативой.

/**
 * Delete a single character from index position 'start' from the 'target' String.
 * 
 * ````
 * deleteAt("ABC", 0) -> "BC"
 * deleteAt("ABC", 1) -> "B"
 * deleteAt("ABC", 2) -> "C"
 * ````
 */
public static String deleteAt(final String target, final int start) {
    return deleteAt(target, start, start + 1);
} 


/**
 * Delete the characters from index position 'start' to 'end' from the 'target' String.
 * 
 * ````
 * deleteAt("ABC", 0, 1) -> "BC"
 * deleteAt("ABC", 0, 2) -> "C"
 * deleteAt("ABC", 1, 3) -> "A"
 * ````
 */
public static String deleteAt(final String target, final int start, int end) {
    final int targetLen = target.length();
    if (start < 0) {
        throw new IllegalArgumentException("start=" + start);
    }
    if (end > targetLen || end < start) {
        throw new IllegalArgumentException("end=" + end);
    }
    if (start == 0) {
        return end == targetLen ? "" : target.substring(end);
    } else if (end == targetLen) {
        return target.substring(0, start);
    }
    final char[] buffer = new char[targetLen - end + start];
    target.getChars(0, start, buffer, 0);
    target.getChars(end, targetLen, buffer, start);
    return new String(buffer);
}

1

* Вы можете удалить строковое значение, используя StringBuilder и deletecharAt.

String s1 = "aabc";
StringBuilder sb = new StringBuilder(s1);
for(int i=0;i<sb.length();i++)
{
  char temp = sb.charAt(0);
  if(sb.indexOf(temp+"")!=1)
  {                             
    sb.deleteCharAt(sb.indexOf(temp+""));   
  }
}

1

Да. У нас есть встроенная функция для удаления отдельного символа строки в java, то есть deleteCharAt

Например,

public class StringBuilderExample 
{
   public static void main(String[] args) 
   {
      StringBuilder sb = new StringBuilder("helloworld");
      System.out.println("Before : " + sb);
      sb = sb.deleteCharAt(3);
      System.out.println("After : " + sb);
   }
}

Вывод

Before : helloworld
After : heloworld

1

Если вы хотите удалить символ из String str по определенному индексу int :

    public static String removeCharAt(String str, int index) {

        // The part of the String before the index:
        String str1 = str.substring(0,index);

        // The part of the String after the index:            
        String str2 = str.substring(index+1,str.length());

        // These two parts together gives the String without the specified index
        return str1+str2;

    }

0
public static String removechar(String fromString, Character character) {
    int indexOf = fromString.indexOf(character);
    if(indexOf==-1) 
        return fromString;
    String front = fromString.substring(0, indexOf);
    String back = fromString.substring(indexOf+1, fromString.length());
    return front+back;
}

0
           BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
   String line1=input.readLine();
   String line2=input.readLine();
         char[]  a=line2.toCharArray();
          char[] b=line1.toCharArray();
           loop: for(int t=0;t<a.length;t++) {

            char a1=a[t];
           for(int t1=0;t1<b.length;t1++) {
               char b1=b[t1];  
               if(a1==b1) {
                   StringBuilder sb = new StringBuilder(line1);
                   sb.deleteCharAt(t1);
                   line1=sb.toString();
                   b=line1.toCharArray();
                   list.add(a1);
                   continue  loop;   
               }


            }

0

Когда у меня возникают вопросы такого рода, я всегда спрашиваю: «Что бы сделали гуру Java?» :)

И в данном случае я бы ответил на это, посмотрев на реализацию String.trim().

Вот экстраполяция этой реализации, которая позволяет использовать больше символов обрезки.

Однако обратите внимание, что исходная обрезка фактически удаляет все имеющиеся символы <= ' ', поэтому вам, возможно, придется объединить это с исходным, чтобы получить желаемый результат.

String trim(String string, String toTrim) {
    // input checks removed
    if (toTrim.length() == 0)
        return string;

    final char[] trimChars = toTrim.toCharArray();
    Arrays.sort(trimChars);

    int start = 0;
    int end = string.length();

    while (start < end && 
        Arrays.binarySearch(trimChars, string.charAt(start)) >= 0)
        start++;

    while (start < end && 
        Arrays.binarySearch(trimChars, string.charAt(end - 1)) >= 0)
        end--;

    return string.substring(start, end);
}

0
public String missingChar(String str, int n) {
  String front = str.substring(0, n);

// Start this substring at n+1 to omit the char.
// Can also be shortened to just str.substring(n+1)
// which goes through the end of the string.

String back = str.substring(n+1, str.length());
  return front + back;
}

0

Чтобы удалить один символ из данной строки, пожалуйста, найдите мой метод, надеюсь, он будет полезен. Я использовал str.replaceAll для удаления строки, но есть много способов удалить символ из данной строки, но я предпочитаю метод replaceall.

Код для удаления символа:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;


public class Removecharacter 
{

    public static void main(String[] args) 
    {
        String result = removeChar("Java", 'a');
        String result1 = removeChar("Edition", 'i');

         System.out.println(result + " " + result1);

    }


    public static String removeChar(String str, char c) {
        if (str == null)
        {
            return null;
        }
        else
        {   
        return str.replaceAll(Character.toString(c), "");
        }
    }


}

Образ консоли:

пожалуйста, найдите прикрепленное изображение консоли,

введите описание изображения здесь

Спасибо за вопрос. :)


0

Я только что реализовал этот служебный класс, который удаляет символ или группу символов из String . Я думаю, это быстро, потому что не использует Regexp. Надеюсь, это кому-то поможет!

package your.package.name;

/**
 * Utility class that removes chars from a String.
 * 
 */
public class RemoveChars {

    public static String remove(String string, String remove) {
        return new String(remove(string.toCharArray(), remove.toCharArray()));
    }

    public static char[] remove(final char[] chars, char[] remove) {

        int count = 0;
        char[] buffer = new char[chars.length];

        for (int i = 0; i < chars.length; i++) {

            boolean include = true;
            for (int j = 0; j < remove.length; j++) {
                if ((chars[i] == remove[j])) {
                    include = false;
                    break;
                }
            }

            if (include) {
                buffer[count++] = chars[i];
            }
        }

        char[] output = new char[count];
        System.arraycopy(buffer, 0, output, 0, count);

        return output;
    }

    /**
     * For tests!
     */
    public static void main(String[] args) {

        String string = "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG";
        String remove = "AEIOU";

        System.out.println();
        System.out.println("Remove AEIOU: " + string);
        System.out.println("Result:       " + RemoveChars.remove(string, remove));
    }
}

Это результат:

Remove AEIOU: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
Result:       TH QCK BRWN FX JMPS VR TH LZY DG

-2

Например, если вы хотите подсчитать, сколько в String, вы можете сделать это следующим образом:

if (string.contains("a"))
{
    numberOf_a++;
    string = string.replaceFirst("a", "");
}

2
Этот ответ не отвечает на вопрос и даже не работает для заявленной цели. Операция замены будет запущена только один раз.
Кенстер 05
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.