Як видалити один символ із рядка


128

Для доступу до окремих символів рядка на Java у нас є String.charAt(2). Чи є якась вбудована функція для видалення індивідуального символу рядка в Java?

Щось на зразок цього:

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

3
Чи можете ви розмістити реальний приклад, де ви хочете це зробити?
Rohit Jain

Ви замінили не видалити. Можливо, вам доведеться написати своє.
коса

Ви можете зробити це з coupleз substringі indexOf. Але це створить новий об'єкт рядка.
Rohit Jain

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

Відповіді:


227

Ви також можете використовувати StringBuilderклас, який можна змінити.

StringBuilder sb = new StringBuilder(inputString);

Він має метод deleteCharAt(), поряд з багатьма іншими мутаційними методами.

Просто видаліть символи, які потрібно видалити, а потім отримайте результат таким чином:

String resultString = sb.toString();

Це дозволяє уникнути створення зайвих рядкових об'єктів.


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

72

Одна можливість:

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

Зауважте, що результат - це нова String (а також два проміжні об'єкти String), оскільки рядки в Java незмінні.


62

Ви можете використовувати метод Java String, який називається заміна, який замінить усі символи, що відповідають першому параметру, другому параметру:

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

15

Ні, тому що рядки на Java незмінні. Вам доведеться створити новий рядок, видаливши символ, який ви не хочете.

Для заміни одного знака cв позиції індексу idxв рядку strзробіть щось подібне і пам’ятайте, що буде створено новий рядок:

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

1
-1: Адресати індивідуальної заміни символуВсе не годиться. Ви не відповідаєте на запитання.
Aubin

1
@Aubin Я оновив свою відповідь на заміну індивідуального символу, маючи на увазі перегляд вашої суботи?
Оскар Лопес

Для адреси окремих символів INDEXED заміна () не підходить. Ви не відповідаєте на запитання (перечитайте його). Я не можу повторно подати заяву ...
Aubin

1
@Aubin перечитав другу частину моєї відповіді, яка стосується цього випадку, подібно до того, як було задано питання, як тепер щодо видалення голосування? відповідь правильна, вона просто вважає один випадок додатковою до тієї, яку задають у питанні.
Оскар Лопес

7
Ваша відповідь тепер зовсім інша, ви спершу замінили "substituAll ()" на "заміна ()", потім замінили "замінити ()" на "підряд (()"). Тепер це дослівна копія 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 []

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

Щоб змінити Strings, прочитайте про 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

Використовуйте функцію substituFirst класу String. Існує так багато варіантів функції заміни, які ви можете використовувати.


1

Якщо вам потрібен певний логічний контроль над видаленням символів, використовуйте це

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

Якщо вам не потрібен такий контроль, ви можете використовувати те, що згадував Оскар абоБеш. Вони на місці.


1

За допомогою методу заміни ми можемо змінити один символ рядка.

string= string.replace("*", "");

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

Якщо ви хочете видалити символ з струнного вул на певному 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 для видалення рядка, але їх багато способів видалити символ із заданої рядки, але я віддаю перевагу методу substituall.

Код для видалення Char:

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

Я щойно реалізував цей клас утиліти, який видаляє значок або групу символів з рядка . Я думаю, що це швидко, тому що не використовує 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

Наприклад, якщо ви хочете обчислити, скільки є в рядку, ви можете зробити це так:

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

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