Jak usunąć pojedynczy znak z ciągu


128

Aby uzyskać dostęp do poszczególnych znaków ciągu w Javie, mamy String.charAt(2). Czy jest jakaś wbudowana funkcja do usuwania pojedynczego znaku ciągu w java?

Coś takiego:

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

3
Czy możesz opublikować prawdziwy przykład, w którym chcesz to zrobić?
Rohit Jain

Masz wymienić nie usunąć. Być może będziesz musiał napisać własne.
kosa

Możesz to zrobić za pomocą coupleof substringi indexOf. Ale to stworzy nowy obiekt string.
Rohit Jain

StringBuilder to klasa do odczytu / zapisu służąca do manipulowania znakami. Możesz utworzyć go z ciągu znaków i użyć sb.toString (), aby uzyskać wynikowy ciąg.
Aubin

Odpowiedzi:


227

Możesz także użyć StringBuilderklasy, która jest zmienna.

StringBuilder sb = new StringBuilder(inputString);

Posiada metodę deleteCharAt(), podobnie jak wiele innych metod mutatorów.

Po prostu usuń znaki, które chcesz usunąć, a następnie uzyskaj wynik w następujący sposób:

String resultString = sb.toString();

Pozwala to uniknąć tworzenia niepotrzebnych obiektów łańcuchowych.


Twoja odpowiedź wydaje się nie działać tutaj ... String numbers = "0123456789"; char c = '2'; numbers = numbers.replace(c, Character.MIN_VALUE); Chcę zastąpić znak „” (pusty)
Surajit Biswas

72

Jedna możliwość:

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

Zwróć uwagę, że wynikiem jest nowy ciąg znaków (oraz dwa pośrednie obiekty typu String), ponieważ ciągi znaków w Javie są niezmienne.


62

Możesz użyć metody Java String o nazwie replace, która zamieni wszystkie znaki pasujące do pierwszego parametru na drugi parametr:

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

15

Nie, ponieważ ciągi znaków w Javie są niezmienne. Będziesz musiał utworzyć nowy ciąg, usuwając znak, którego nie chcesz.

Aby zamienić pojedynczy znak cw pozycji indeksu idxw ciągu str, zrób coś takiego i pamiętaj, że zostanie utworzony nowy ciąg:

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

1
-1: do adresowania pojedynczych znaków replaceAll nie jest właściwe. Nie odpowiadasz na pytanie.
Aubin

1
@Aubin Zaktualizowałem moją odpowiedź dotyczącą zamiany indywidualnego znaku, czy możesz ponownie rozważyć Twój głos negatywny?
Óscar López

Do adresowania pojedynczego znaku INDEXED nie jest właściwe zastępowanie (). Nie odpowiadasz na pytanie (przeczytaj je ponownie). Nie mogę ponownie zagłosować ...
Aubin

1
@Aubin ponownie przeczytał drugą część mojej odpowiedzi, która dotyczy tego przypadku, tak jak zadane pytanie, a teraz co z usunięciem głosu przeciw? odpowiedź jest prawidłowa, uwzględnia tylko jeden przypadek dodatkowy w stosunku do zadanego w pytaniu.
Óscar López

7
Twoja odpowiedź jest teraz zupełnie inna, najpierw zastąpiłeś „replaceAll ()” przez „replace ()”, a następnie „zamień ()” na „podciąg ()”. Teraz jest to dosłowna kopia atkretsch, która równie szybko i poprawnie odpowiedziała na pytanie. Twoja odpowiedź niczego więcej nie dodaje. Usuń to, proszę.
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);

zastąpić()

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

zwęglać[]

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

Rozważ następujący kod:

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

Możesz także użyć (ogromnej) maszyny regexp.

inputString = inputString.replaceFirst("(?s)(.{2}).(.*)", "$1$2");
  • "(?s)" - mówi regexp, aby obsługiwał znaki nowej linii jak zwykłe znaki (na wszelki wypadek).
  • "(.{2})" - grupa $ 1 zbierająca dokładnie 2 znaki
  • "." - dowolny znak pod indeksem 2 (do wyciśnięcia).
  • "(.*)" - grupa $ 2, która zbiera resztę ciągu wejściowego.
  • "$1$2" - łączenie grupy $ 1 i grupy $ 2.

3

Aby zmodyfikować ciągi, przeczytaj o StringBuilder, ponieważ jest on zmienny z wyjątkiem niezmiennego String. Różne operacje można znaleźć tutaj https://docs.oracle.com/javase/tutorial/java/data/buffers.html . Poniższy fragment kodu tworzy StringBuilder, a następnie dołącza dany String, a następnie usuwa pierwszy znak z String, a następnie konwertuje go z powrotem z StringBuilder na String.

StringBuilder sb = new StringBuilder();

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

1

Użyj funkcji replaceFirst klasy String. Jest tak wiele wariantów funkcji zamiany, których możesz użyć.


1

Jeśli potrzebujesz logicznej kontroli nad usuwaniem znaków, użyj tego

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

Jeśli nie potrzebujesz takiej kontroli, możesz użyć tego, o czym wspomniał Oscar lub Bhesh. Są na miejscu.


1

Metodą using replace możemy zmienić pojedynczy znak ciągu.

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

1

Najłatwiejszy sposób na usunięcie znaku z ciągu

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

W większości przypadków użycia StringBuilderlub substringjest dobrym podejściem (jak już udzielono). Jednak w przypadku kodu krytycznego dla wydajności może to być dobra alternatywa.

/**
 * 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

* Możesz usunąć wartość ciągu, używając StringBuilder i 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

Tak. Mamy wbudowaną funkcję usuwania pojedynczego znaku ciągu w java, czyli deleteCharAt

Na przykład,

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

Wynik

Before : helloworld
After : heloworld

1

Jeśli chcesz usunąć char z String str przy określonej int index :

    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

Kiedy mam tego rodzaju pytania, zawsze zadaję: „co zrobiliby Java Guru?” :)

Odpowiedziałbym na to w tym przypadku, patrząc na implementację String.trim().

Oto ekstrapolacja tej implementacji, która pozwala na użycie większej liczby znaków przycinania.

Należy jednak pamiętać, że oryginalne przycinanie w rzeczywistości usuwa wszystkie znaki, które są <= ' ', więc może być konieczne połączenie tego z oryginałem, aby uzyskać pożądany efekt.

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

Aby usunąć pojedynczy znak z podanego ciągu, znajdź moją metodę, mając nadzieję, że będzie użyteczna. Użyłem str.replaceAll, aby usunąć ciąg, ale istnieje wiele sposobów na usunięcie znaku z danego ciągu, ale wolę metodę replaceall.

Kod do usunięcia znaku:

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), "");
        }
    }


}

Obraz konsoli:

proszę znaleźć załączony obraz konsoli,

wprowadź opis obrazu tutaj

Dzięki, że pytasz. :)


0

Właśnie zaimplementowałem tę klasę narzędziową, która usuwa znak lub grupę znaków z łańcucha . Myślę, że jest szybki, ponieważ nie używa Regexp. Mam nadzieję, że komuś to pomoże!

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

Oto wynik:

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

-2

Na przykład, jeśli chcesz obliczyć liczbę a w ciągu, możesz to zrobić w następujący sposób:

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

2
Ta odpowiedź nie odpowiada na pytanie, a nawet nie działa zgodnie z określonym celem. Operację zamiany uruchomi tylko raz.
Kenster,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.