文字列内の特定のインデックスの文字を置き換えますか?

2011年08月05日に質問されました。  ·  閲覧回数 892.2k回  ·  ソース

dpp picture
2011年08月05日

文字列内の特定のインデックスにある文字を置き換えようとしています。

私がしていることは:

String myName = "domanokz";
myName.charAt(4) = 'x';

これによりエラーが発生します。 これを行う方法はありますか?

回答

Petar Ivanov picture
2011年08月05日
587

文字列は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);
16dots picture
2012年11月11日
168

文字列をchar []に変換し、文字をインデックスに置き換えてから、配列を文字列に変換し直します。

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
no name picture
2011年08月05日
19

Stringは、Javaの不変クラスです。 それを変更しているように見えるメソッドは、常に変更された新しい文字列オブジェクトを返します。

文字列を操作する場合は、スレッドセーフが必要な場合に備えて、 StringBuilderまたはStringBufferを検討してください。

Leninkumar Koppoju picture
2012年05月02日
13

私はPetarIvanovに同意しますが、次の方法で実装するのが最善です。

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);       
}
C.Champagne picture
2015年10月20日
6

ここで以前に回答したように、 Stringインスタンスは不変です。 StringBufferStringBuilderは変更可能であり、スレッドセーフである必要があるかどうかに関係なく、このような目的に適しています。

ただし、文字列を変更する方法はありますが、安全性が低く、信頼性が低く、不正行為と見なされる可能性があるため、お勧めしません。リフレクションを使用char配列を変更できます。 リフレクションを使用すると、現在のスコープで通常は非表示になっているフィールドとメソッド(プライベートメソッドまたは別のクラスのフィールド...)にアクセスできます。

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();
    }
}
CodeMed picture
2013年04月16日
5

次のように、文字列を上書きできます。

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

文字列myNameは、両方の行と2行目の両側にあることに注意してください。

したがって、文字列は技術的には不変である可能性がありますが、実際には、文字列を上書きすることで編集可能として扱うことができます。

dpp picture
2012年06月20日
0

最初に気付いたのは、 charAtはメソッドであり、等号を使用して値を割り当てても何も起こらないということです。 文字列が不変の場合、 charAtメソッドは、文字列オブジェクトに変更を加えるために、新しい文字を含む引数を受け取る必要があります。 残念ながら、文字列は不変です。 文字列を変更するには、PetarIvanov氏の提案に従ってStringBuilderを使用する必要がありました。

Diabolus Infernalis picture
2012年08月23日
-7

これはうまくいくでしょう

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

出力:domaxokz