Ganti karakter pada indeks tertentu dalam sebuah string?

382

Saya mencoba mengganti karakter pada indeks tertentu dalam sebuah string.

Yang saya lakukan adalah:

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

Ini memberikan kesalahan. Apakah ada metode untuk melakukan ini?

dpp
sumber
12
Saya menyadari ini telah dijawab sampai mati, tetapi perlu dicatat bahwa tidak pernah diizinkan untuk menetapkan hasil pemanggilan fungsi di java. Tidak ada yang namanya referensi C (?) Dan C ++.
ApproachingDarknessFish
1
@ValekHalfHeart di VB, Anda menggunakan tanda kurung untuk mengakses indeks array, yang mungkin menjadi alasan mengapa saya bingung ketika saya memulai di Jawa: D
dpp
@ApproachingDarknessFish Saya tidak yakin apa yang Anda maksud dengan itu "tidak pernah diizinkan untuk menetapkan hasil pemanggilan fungsi di java". Tentunya Anda bisa melakukannya double r = Math.sin(3.14)? Bagaimana hubungannya dengan pertanyaan ini? Terima kasih.
flow2k
1
@ flow2k Oh ya ampun, komentar tua jadi saya tidak bisa mengedit tapi itu salah ketik, itu harus mengatakan bahwa "itu tidak pernah diperbolehkan untuk menetapkan untuk hasil dari pemanggilan fungsi di Jawa". Yaitu Anda dapat menulis "foo = bar ();" tetapi tidak pernah "bar () = foo;".
ApproachingDarknessFish
Terima kasih atas klarifikasi @ApproachingDarknessFish. Saya pikir itu akan aneh untuk menetapkan sesuatu ke hasil fungsi - apakah ada bahasa yang sebenarnya mengizinkan ini? Saya ingin tahu seperti apa penggunaannya.
flow2k

Jawaban:

566

String tidak dapat diubah di Jawa. Anda tidak dapat mengubahnya.

Anda perlu membuat string baru dengan karakter diganti.

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

Atau Anda dapat menggunakan StringBuilder:

StringBuilder myName = new StringBuilder("domanokz");
myName.setCharAt(4, 'x');

System.out.println(myName);
Petar Ivanov
sumber
3
Ah, maksud Anda seperti replacemetode yang tidak akan mengubah string tetapi hanya akan mengembalikan string baru?
dpp
1
Mr.Petar agak rumit. Apakah itu cara terbaik Anda untuk melakukannya? Ah, saya pernah mendengar tentang StringBuilder sebelumnya, apakah itu ada bedanya? Apakah ini akan memberi saya metode yang lebih mudah?
dpp
158

Ubah String menjadi char [], ganti huruf dengan indeks, lalu ubah array kembali menjadi String.

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);
16 titik
sumber
1
Cintai solusi ini. Saya akhirnya mengubah baris ke-3 menjadi myNameChars [index] = character.toCharArray () [0]; untuk penyederhanaan. Solusi yang bagus.
Dale
2
terlihat jauh lebih baik daripada yang lebih jelek lainnyamyName.substring(0,4)+'x'+myName.substring(5);
user924
Ini jauh lebih sederhana
Shiva Acharjee
19

Stringadalah kelas yang tidak dapat diubah di java. Metode apa pun yang tampaknya memodifikasinya selalu mengembalikan objek string baru dengan modifikasi.

Jika Anda ingin memanipulasi string, pertimbangkan StringBuilderatau StringBufferjika Anda memerlukan keamanan utas.

tanpa nama
sumber
12

Saya setuju dengan Petar Ivanov tetapi yang terbaik adalah jika kita menerapkan dengan cara berikut:

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);       
}
Leninkumar Koppoju
sumber
21
dan apa yang membuat solusi Anda lebih baik?
dpp
6

Seperti yang dijawab sebelumnya di sini, Stringinstance tidak dapat diubah . StringBufferdan StringBuilderbisa berubah dan cocok untuk tujuan seperti itu apakah Anda perlu aman atau tidak.

Namun ada cara untuk memodifikasi sebuah String tetapi saya tidak akan merekomendasikannya karena itu tidak aman, tidak dapat diandalkan dan dapat dianggap sebagai kecurangan: Anda dapat menggunakan refleksi untuk memodifikasi chararray bagian dalam yang berisi objek String. Refleksi memungkinkan Anda untuk mengakses bidang dan metode yang biasanya disembunyikan dalam lingkup saat ini (metode atau bidang pribadi dari kelas lain ...).

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();
    }
}
C.Champagne
sumber
4

Anda dapat menimpa string, sebagai berikut:

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

Perhatikan bahwa string myNameterjadi di kedua garis, dan di kedua sisi garis kedua.

Oleh karena itu, meskipun string secara teknis tidak dapat diubah, dalam praktiknya, Anda dapat memperlakukannya sebagai dapat diedit dengan menimpa mereka.

CodeMed
sumber
Saya belum menurunkan jawaban Anda, tetapi saya harus mengakui bahwa saya memiliki masalah dengan istilah "menimpa" (meskipun saya pikir kami setuju dengan konsep di balik). Objek itu sendiri tetap tidak berubah. Anda hanya membuat referensi variabel Anda objek lain. Ngomong-ngomong, Anda menarik untuk menyebutkan bahwa Anda membuat setidaknya empat instance String dalam contoh Anda.
C.Champagne
0

Hal pertama yang harus saya perhatikan adalah charAtmetode dan memberikan nilai padanya menggunakan tanda sama dengan tidak akan melakukan apa pun. Jika string tidak dapat diubah, charAtmetode, untuk membuat perubahan ke objek string harus menerima argumen yang berisi karakter baru. Sayangnya, string tidak dapat diubah. Untuk memodifikasi string, saya harus menggunakan StringBuilder seperti yang disarankan oleh Mr. Petar Ivanov.

dpp
sumber
-7

ini akan berhasil

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

Output: domaxokz

Diabolus Infernalis
sumber
1
walaupun saya sangat membenci metode ini karena diizinkan "dapat diedit" dari karya lain di situs StackOverFlow ini. benar-benar tidak adil: /
Diabolus Infernalis
2
Kesalahan sintaks. Dan bahkan jika dikoreksi, katakan saya ingin mengganti 'o' pertama dengan 'x', yang kedua 'o' akan diganti juga.
dpp
2
Ini akan menggantikan semua karakter yang sama dengan karakter 4.
Shripad Bhat
1
Masalah: myName.replace(myName.charAt(5),'x')akan memberi Anda dxmanxkz, yang mungkin bukan yang dibutuhkan.
Dawood ibn Kareem