文字列内の特定のインデックスにある文字を置き換えようとしています。
私がやっていることは:
String myName = "domanokz";
myName.charAt(4) = 'x';
これはエラーになります。これを行う方法はありますか?
double r = Math.sin(3.14)
か?この質問とどのように関連していますか?ありがとう。
文字列内の特定のインデックスにある文字を置き換えようとしています。
私がやっていることは:
String myName = "domanokz";
myName.charAt(4) = 'x';
これはエラーになります。これを行う方法はありますか?
double r = Math.sin(3.14)
か?この質問とどのように関連していますか?ありがとう。
回答:
文字列は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);
replace
は文字列を変更せずに新しい文字列を返すだけの方法が好きですか?
文字列をchar []に変換し、文字をインデックスで置き換えてから、配列を文字列に変換します。
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
myName.substring(0,4)+'x'+myName.substring(5);
私はペタルイワノフに同意しますが、次の方法で実装するのが最善です。
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);
}
以前にここで回答したように、String
インスタンスは不変です。StringBuffer
そしてStringBuilder
、あなたが安全かどうかのスレッドにする必要があるかどうか、そのような目的のために変更可能と適しています。
ただし、文字列を変更する方法はありますが、安全ではなく、信頼性がなく、不正行為と見なされる可能性があるため、私は推奨しません。リフレクションを使用して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();
}
}
次のように、文字列を上書きできます。
String myName = "halftime";
myName = myName.substring(0,4)+'x'+myName.substring(5);
文字列myName
は両方の行と、2行目の両側にあることに注意してください。
したがって、文字列は技術的には不変であっても、実際には、上書きすることで編集可能として扱うことができます。
これはうまくいく
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
出力:domaxokz
myName.replace(myName.charAt(5),'x')
はを提供しますがdxmanxkz
、これはおそらく必要なことではありません。