Как удалить персонажа из строки? - PullRequest
2 голосов
/ 27 мая 2011
public static String removeChar(String s, char c) {
  StringBuffer r = new StringBuffer( s.length() );
  r.setLength( s.length() );
  int current = 0;
  for (int i = 0; i < s.length(); i ++) {
     char cur = s.charAt(i);
     if (cur != c) r.setCharAt( current++, cur );
  }
  return r.toString();
}

Я нашел вышеуказанный код здесь .

Два вопроса:

  1. зачем нам нужно делать setLength ()? без которого я получаю java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 0

  2. 'ttr' и три ненужных символа появляются, когда я запускаю эту программу с параметрами - "teeter" и "e". Как удалить неиспользуемые пробелы в буфере?

Ответы [ 8 ]

6 голосов
/ 27 мая 2011

Почему бы просто не использовать replaceAll? java.lang.String.replaceAll

2 голосов
/ 27 мая 2011

Я отвечу на ваши вопросы:

1 - зачем нам делать setLength ()? без которого я получаю java.lang.StringIndexOutOfBoundsException: Индекс строки вне диапазона: 0

Изначально в вашем строковом буфере нет символов. Вам нужно вызвать setLength, чтобы заполнить пустой строковый буфер символами. Нулевые символы, '\ 0' (или ненужные символы, как вы их называете) добавляются в строковый буфер, чтобы он достигал указанной длины. Если вы этого не сделаете, вы получите StringIndexOutOfBoundsException, потому что в вашем строковом буфере нет символов. См. Javadocs на StringBuffer # setLength .

Итак, в конце вашего метода ваш строковый буфер имеет: [t][t][r][\0][\0][\0]

2 - «ttr» и три барахла появляются, когда я запускаю эту программу с параметры - «качели» и «е». Как удалите неиспользуемые пробелы в буфер

Вы можете удалить нулевые символы, вызвав: r.toString().trim() или r.substring(0,current)

1 голос
/ 27 мая 2011

Похоже, вы просто хотите использовать String.replaceAll (СТАРЫЙ, НОВЫЙ);

0 голосов
/ 27 июня 2018

Ну, в классе java.lang.String есть много методов.Одним из них является метод replaceAll ().

Например,

public class ReplaceAllDemo
{
   public static void main(String[] args)
   {
      String strDemo = "Sam hates java";    
      System.out.println("Before : " + strDemo);
      strDemo = strDemo.replaceAll("hates", "loves");    
      System.out.println("After : " + strDemo);
   }
}

Выход

Before : Sam hates java
After : Sam loves java

Подробнее о классе строк см. Нижересурсы для объяснения и примеров:

String replaceAll

String replaceAll example

0 голосов
/ 27 мая 2011

Вы можете использовать:

public static String removeChar(String s, char c) {
    StringBuilder r = new StringBuilder();

    for (int i = 0; i < s.length(); i++) {
        char cur = s.charAt(i);
        if (cur != c) {
            r.append(cur);
        }
    }

    return r.toString();
}
0 голосов
/ 27 мая 2011

Игнорируя тот факт, что вы можете использовать String.replaceAll () ...

Вы должны использовать метод добавления:

  public static String removeChar(final String s, final char c) {
    final StringBuffer r = new StringBuffer(s.length());
    for (int i = 0; i < s.length(); i++) {
      final char cur = s.charAt(i);
      if (cur != c) {
        r.append(cur);
      }
    }
    return r.toString();
  }

Теперь вы не получите исключение StringIndexOutOfBoundsException.

Кстати, в однопоточной среде вы действительно должны использовать StringBuilder.

0 голосов
/ 27 мая 2011

Существует более простое решение:

public static String removeChar(String s, char c) {
    return s.replaceAll(Pattern.quote(new StringBuilder().append(c).toString()), "");
}
0 голосов
/ 27 мая 2011

Каждый строковый буфер имеет емкость. Как пока длина персонажа последовательность, содержащаяся в строке буфер не превышает емкость, не нужно выделять новый внутренний буферный массив.

API - http://download.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html

Во-вторых, вы можете просто вызвать обрезку строки, если хотите удалить пробелы из начала и конца.

Но другие комментарии, предлагающие использовать замену / замену, являются наиболее подходящими. Зачем переписывать встроенный метод.

http://download.oracle.com/javase/6/docs/api/java/lang/String.html#replace(char, символ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...