문자열의 특정 색인에서 문자를 바꾸려고합니다.
내가하고있는 일은 :
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);
Petar Ivanov에 동의하지만 다음과 같은 방식으로 구현하는 것이 가장 좋습니다.
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
은 두 줄과 두 번째 줄의 양쪽에 나타납니다.
따라서 기술적으로 문자열을 변경할 수는 없지만 실제로 덮어 쓰면 편집 가능한 것으로 간주 할 수 있습니다.
이 작동합니다
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
출력 : domaxokz
myName.replace(myName.charAt(5),'x')
당신에게 줄 것 dxmanxkz
입니다. 아마도 필요하지 않습니다.