Как заменить определенные символы в строке в зависимости от пользователя, угадывающего [дубликат]

Парсер парсера Javascript с метаданными для более чем 200 стран: https://github.com/googlei18n/libphonenumber

280
задан jww 16 February 2015 в 04:05
поделиться

8 ответов

Строка неизменна в Java. Вы не можете их изменить.

Вам нужно создать новую строку с замененным символом.

String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);

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

StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');

System.out.println(myName);
438
ответ дан waldyr.ar 16 August 2018 в 11:26
поделиться
  • 1
    Ах, вы имеете в виду, как метод replace, который не будет изменять строку, но просто вернет новую строку? – dpp 5 August 2011 в 07:39
  • 2
    Это довольно сложный мистер Петар. Это лучший способ сделать это? Ах, я слышал о StringBuilder раньше, не имеет значения? Это даст мне более простой метод? – dpp 5 August 2011 в 07:41
  • 3
    yes, StringBuilder изменен – Petar Ivanov 5 August 2011 в 07:43

Поверните String в char [], замените букву индексом, затем преобразуйте массив обратно в String.

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
106
ответ дан 16dots 16 August 2018 в 11:26
поделиться
  • 1
    Действительно приятно, спасибо – delive 26 October 2015 в 09:58
  • 2
    Любите это решение. Я закончил тем, что менял 3-ю строку, чтобы быть myNameChars [index] = character.toCharArray () [0]; для упрощения. Хорошее решение. – Dale 1 March 2017 в 22:22

Как было сказано ранее, экземпляры String неизменяемы. StringBuffer и StringBuilder являются изменяемыми и подходят для этой цели, нужно ли вам быть потокобезопасными или нет.

Однако есть способ изменить строку, но я бы никогда не рекомендовал ее, потому что это небезопасный, ненадежный и его можно считать обманом: вы можете использовать отражение для изменения внутреннего массива char, содержащего объект String. Reflection позволяет вам получать доступ к полям и методам, которые обычно скрыты в текущей области (частные методы или поля из другого класса ...).

public static void main(String[] args) {
    String text = "This is a test";
    try {
        //String.value is the array of char (char[])
        //that contains the text of the String
        Field valueField = String.class.getDeclaredField("value");
        //String.value is a private variable so it must be set as accessible 
        //to read and/or to modify its value
        valueField.setAccessible(true);
        //now we get the array the String instance is actually using
        char[] value = (char[])valueField.get(text);
        //The 13rd character is the "s" of the word "Test"
        value[12]='x';
        //We display the string which should be "This is a text"
        System.out.println(text);
    } catch (NoSuchFieldException | SecurityException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}
5
ответ дан C.Champagne 16 August 2018 в 11:26
поделиться

Прежде всего я должен был заметить, что charAt - это метод и присвоение ему значения с использованием знака равенства, ничего не сделает. Если строка неизменяема, метод charAt, чтобы внести изменения в объект string, должен получить аргумент, содержащий новый символ. К сожалению, строка неизменна. Чтобы изменить строку, мне нужно было использовать StringBuilder, как предложил г-н Петр Иванов.

0
ответ дан dpp 16 August 2018 в 11:26
поделиться

Вы можете перезаписать строку следующим образом:

String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);  

Обратите внимание, что строка myName встречается на обеих линиях и по обеим сторонам второй строки.

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

3
ответ дан fenceop 16 August 2018 в 11:26
поделиться
  • 1
    Я не отклонил ваш ответ, но должен признать, что у меня проблема с термином «перезаписать». (хотя я думаю, что мы согласны с концепцией). Сам объект остается неизменным. Вы просто заставляете переменную ссылаться на другой объект. Кстати, вам интересно упомянуть, что вы создаете по крайней мере четыре экземпляра String в вашем примере. – C.Champagne 20 October 2015 в 12:47

Я согласен с Петра Иванова, но лучше всего реализовать это следующим образом:

public String replace(String str, int index, char replace){     
    if(str==null){
        return str;
    }else if(index<0 || index>=str.length()){
        return str;
    }
    char[] chars = str.toCharArray();
    chars[index] = replace;
    return String.valueOf(chars);       
}
11
ответ дан Leninkumar Koppoju 16 August 2018 в 11:26
поделиться
  • 1
    и что делает ваше решение лучше? – dpp 3 May 2012 в 02:43
  • 2
    Неудачное молчание, потому что это такая приятная вещь ... – Luan Nico 12 May 2015 в 16:24

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

17
ответ дан no name 16 August 2018 в 11:26
поделиться

это будет работать

   String myName="domanokz";
   String p=myName.replace(myName.charAt(4),'x');
   System.out.println(p);

Выход: domaxokz

-7
ответ дан Rachel Gallen 16 August 2018 в 11:26
поделиться
  • 1
    да спасибо.. – Diabolus Infernalis 23 August 2012 в 17:37
  • 2
    хотя я категорически ненавижу этот способ разрешения «редактируемости». других работ на этом сайте StackOverFlow. полностью несправедливо: / – Diabolus Infernalis 23 August 2012 в 17:39
  • 3
    Ошибка синтаксиса. И даже если исправлено, скажем, я хочу заменить первый «o» на «x», второй «o» тоже будет заменен. – dpp 7 September 2012 в 05:46
  • 4
    Это заменит все символы, аналогичные charAt 4. – Shripad Bhat 8 August 2015 в 13:10
  • 5
    Проблема: myName.replace(myName.charAt(5),'x') даст вам dxmanxkz, что, вероятно, не является тем, что требуется. – Dawood ibn Kareem 29 January 2017 в 07:35
Другие вопросы по тегам:

Похожие вопросы: