문자열의 특정 인덱스에 있는 문자를 바꾸시겠습니까?
문자열의 특정 색인에 있는 문자를 바꾸려고 합니다.
내가 하고 있는 일은:
String myName = "domanokz";
myName.charAt(4) = 'x';
그러면 오류가 발생합니다.이것을 할 수 있는 방법이 있나요?
Java에서는 문자열은 불변입니다.당신은 그들을 바꿀 수 없어요.
문자를 대체한 새 문자열을 생성해야 합니다.
String myName = "domanokz";
String newName = myName.substring(0,4)+'x'+myName.substring(5);
또는 String Builder를 사용할 수 있습니다.
StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');
System.out.println(myName);
String을 char[]로 변환하고 인덱스로 문자를 바꾼 다음 배열을 String으로 다시 변환합니다.
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
String
는 Java에서 불변의 클래스입니다.수정하는 것 같은 메서드는 항상 변경된 새 문자열 개체를 반환합니다.
문자열을 조작하는 경우는,StringBuilder
또는StringBuffer
나사산 안전이 필요한 경우.
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
는, 스레드 세이프가 필요한지 아닌지에 관계없이, 이러한 목적에 적합하고 가변적입니다.
그러나 String을 변경하는 방법은 있지만 안전하지 않고 신뢰할 수 없으며 부정행위로 간주될 수 있기 때문에 권장하지 않습니다.반사를 사용하여 내부를 변경할 수 있습니다.char
Array를 지정합니다.리플렉션을 사용하면 현재 범위에 일반적으로 숨겨져 있는 필드 및 메서드(개인 메서드 또는 다른 클래스의 필드...)에 액세스할 수 있습니다.
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
두 번째 줄 양쪽에서 발생합니다.
따라서 문자열은 기술적으로 불변할 수 있지만 실제로는 덮어쓰기를 통해 편집 가능한 문자열로 간주할 수 있습니다.
내가 가장 먼저 알아챘어야 했던 것은charAt
등호를 사용하여 값을 할당하는 방법은 없습니다.끈이 불변하면charAt
method를 사용하여 string 개체를 변경하려면 새 문자를 포함하는 인수를 수신해야 합니다.불행히도 끈은 불변이다.문자열을 수정하기 위해 Petar Ivanov씨의 제안대로 String Builder를 사용해야 했습니다.
이와 같이 동일한 문자열에 덮어쓸 수 있습니다.
String myName = "domanokz";
myName = myName.substring(0, index) + replacement + myName.substring(index+1);
여기서 index = 대체할 char의 인덱스입니다.index+1: 문자열의 나머지 부분을 추가합니다.
이거면 될 것 같아
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
출력 : domaxokz
언급URL : https://stackoverflow.com/questions/6952363/replace-a-character-at-a-specific-index-in-a-string
'programing' 카테고리의 다른 글
C++ 코드를 C로 변환하는 방법 (0) | 2022.06.11 |
---|---|
java equals() 메서드 덮어쓰기 - 작동하지 않음 (0) | 2022.06.11 |
한 번에 여러 개의 값을 구조체에 할당하는 방법 (0) | 2022.06.10 |
날짜 오브젝트를 일정관리 오브젝트로 변환 (0) | 2022.06.10 |
Vuex 스토어 내 2차원 배열에서 항목 업데이트 (0) | 2022.06.10 |