ฉันพยายามแทนที่ตัวละครที่ดัชนีเฉพาะในสตริง
สิ่งที่ฉันทำคือ:
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
วิธีที่จะไม่แก้ไขสตริง แต่เพิ่งจะส่งกลับสตริงใหม่หรือไม่
เปลี่ยนสตริงให้เป็นอักขระถ่าน [] แทนที่ตัวอักษรตามดัชนีจากนั้นแปลงอาร์เรย์กลับเป็นสตริง
String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
myName.substring(0,4)+'x'+myName.substring(5);
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
ไม่แน่นอนและเหมาะสมกับวัตถุประสงค์ดังกล่าวไม่ว่าคุณจะต้องปลอดภัยหรือไม่
อย่างไรก็ตามมีวิธีการแก้ไขสตริง แต่ฉันจะไม่แนะนำเพราะมันไม่ปลอดภัยไม่น่าเชื่อถือและสามารถถือได้ว่าเป็นการโกง: คุณสามารถใช้การสะท้อนเพื่อปรับเปลี่ยน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
เกิดขึ้นบนทั้งสองบรรทัดและบนทั้งสองด้านของบรรทัดที่สอง
ดังนั้นแม้ว่าในทางเทคนิคสตริงอาจไม่เปลี่ยนรูป แต่ในทางปฏิบัติคุณสามารถปฏิบัติต่อมันได้โดยการเขียนทับมัน
สิ่งแรกที่ฉันควรสังเกตุคือcharAt
วิธีการและการกำหนดค่าโดยใช้เครื่องหมายเท่ากับจะไม่ทำอะไรเลย หากสตริงไม่เปลี่ยนรูปcharAt
วิธีการในการเปลี่ยนแปลงวัตถุสตริงจะต้องได้รับการโต้แย้งที่มีตัวละครใหม่ น่าเสียดายที่สตริงไม่เปลี่ยนรูป ในการปรับเปลี่ยนสตริงฉันต้องใช้ StringBuilder ตามที่นาย Petar Ivanov แนะนำ
สิ่งนี้จะได้ผล
String myName="domanokz";
String p=myName.replace(myName.charAt(4),'x');
System.out.println(p);
ผลลัพธ์: domaxokz
myName.replace(myName.charAt(5),'x')
จะให้คุณdxmanxkz
ซึ่งอาจไม่จำเป็นต้องใช้