Soru Bir dizgede belirli bir dizindeki bir karakteri değiştirir misiniz?


Bir dizede belirli bir dizindeki bir karakteri değiştirmeye çalışıyorum.

Yaptığım şey:

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

Bu bir hata verir. Bunu yapmak için herhangi bir yöntem var mı?


280
2017-08-05 06:36


Menşei


Bunun ölümle cevaplandığını anlıyorum ama bunun dikkati çekmeye değer. asla java'da bir işlev çağrısının sonucunu atamasına izin verildi. C (?) Ve C ++ 'nın referansları gibi şeyler yoktur. - ApproachingDarknessFish
VB'de @ValekHalfHeart, bir dizinin dizinine erişmek için parantez kullanırsınız. Bu, Java’da başladığım zaman kafamın karışmamasının nedeni olabilir: D - dpp
@ApproachingDarknessFish "Java'da bir işlev çağrısının sonucunu atamasına asla izin verilmez" ile ne demek istediğinden emin değilim. Kesinlikle yapabilirsin double r = Math.sin(3.14)? Bu soruyla nasıl bağlantılı? Teşekkürler. - flow2k
@ flow2k Oh jeez, eski yorum bu yüzden düzenleme yapamıyorum ama bu bir yazım hatası, bu "asla atamak için izin verilmez için Java'da bir işlev çağrısının sonucu ".e." yazabilirsiniz "foo = bar ();" ama asla "bar () = foo;". - ApproachingDarknessFish
Açıklamaya @ApproachingDarknessFish için teşekkürler. Bir işlevin sonucuna bir şey atamak garip olur - aslında buna izin veren diller var mı? Kullanım durumunun ne olacağını merak ediyorum. - flow2k


Cevaplar:


String, Java'da değişmezdir. Onları değiştiremezsin.

Karakterin değiştirildiği yeni bir dize oluşturmanız gerekir.

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

Ya da bir StringBuilder kullanabilirsiniz:

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

System.out.println(myName);

437
2017-08-05 06:38



Ah, sen replace dizeyi değiştirmeyecek, ancak yeni bir dizge döndürecek olan yöntem mi? - dpp
Bu biraz karmaşık BayPetar. Bunu yapmanın en iyi yolu bu mu? Ah, StringBuilder'ı daha önce duydum, bu bir fark yaratıyor mu? Bana daha kolay bir yöntem mi verecek? - dpp
evet, StringBuilder değişebilir - Petar Ivanov


Dizeyi bir char [] haline getirin, harfi indeksle değiştirin ve diziyi tekrar bir String'e dönüştürün.

String myName = "domanokz";
char[] myNameChars = myName.toCharArray();
myNameChars[4] = 'x';
myName = String.valueOf(myNameChars);

106
2017-11-10 21:11



Gerçekten güzel, teşekkürler - delive
Bu çözümü seviyorum. 3 satırını myNameChars [index] = character.toCharArray () [0] olarak değiştirdim; basitleştirme için. Güzel çözüm. - Dale


String, javada değişmez bir sınıftır ve her zaman yeni bir dize nesnesini modifikasyonla döndüren herhangi bir yöntemdir. Eğer bir ipliği değiştirmek istiyorsanız iplik güvenliği gerektiren durumlarda StringBuilder veya StringBuffer'ı düşünün.


17
2017-08-05 07:00





Petar Ivanov'a katılıyorum ama şu şekilde uygularsak en iyisi:

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);       
}

11
2018-05-02 14:16



ve çözümünüzü daha iyi yapan nedir? - dpp
Sessizce başarısız, çünkü bu çok hoş bir şey ... - Luan Nico


Daha önce burada cevaplandığı gibi, String örnekler değişmez. StringBuffer ve StringBuilder iş parçacığı olmanız gerekip gerekmediğine karar verilebilir ve böyle bir amaç için uygundur.

Ancak bir String'i modifiye etmenin bir yolu var ama bunu asla tavsiye etmem çünkü güvensiz, güvenilmez ve hile olarak kabul edilebilir: yansıma iç değiştirmek char String nesnesinin içerdiği dizi. yansıma Mevcut kapsamda normalde gizlenmiş alanlara ve yöntemlere erişmenizi sağlar (özel yöntemler veya başka bir sınıftaki alanlar ...).

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();
    }
}

5
2017-10-20 13:46





Aşağıdaki gibi bir dizenin üzerine yazabilirsiniz:

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

Dize olduğunu unutmayın myName Her iki satırda ve ikinci satırın her iki tarafında oluşur.

Bu nedenle, dizeler teknik olarak değişmez olsa bile, pratikte bunları üzerine yazarak düzenlenebilir olarak davranabilirsiniz.


3
2018-04-16 00:06



Cevabınızı düşürmedim ama "overwrite" terimi ile ilgili bir problemim olduğunu itiraf etmeliyim (gerçi konseptin arkasında anlaştığımızı düşünüyorum). Nesnenin kendisi değişmeden kalır. Değişken referansınızı başka bir nesneyle yapın. Bu arada, örneğinizde en az dört String örneği oluşturduğunuzu belirtmek ilginç olacaktır. - C.Champagne


Fark etmem gereken ilk şey, charAt bir yöntemdir ve eşittir işaretini kullanarak ona değer atamak hiçbir şey yapmayacaktır. Bir dize değişmezse, charAt yöntemi, string nesnesinde değişiklik yapmak için yeni karakteri içeren bir argüman almalıdır. Maalesef dize değişmez. Dizeyi değiştirmek için Bay Petar Ivanov'un önerdiği gibi StringBuilder kullanmam gerekiyordu.


0
2018-06-20 07:58





bu çalışacak

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

Çıkış: domaxokz


-7
2017-08-22 16:31



Evet teşekkürler.. - Diabolus Infernalis
Her ne kadar bu StackOverFlow sitesindeki diğerlerinin çalışmalarına "düzenlenebilirlik" izni verilmesine izin verdiğim konusunda çok kararlıyım. tamamen haksızlık: / - Diabolus Infernalis
Sözdizimi hatası. Ve düzeltilmiş olsa bile, ilk 'o' yerine 'x' ile değiştirmek istiyorum, ikinci 'o' da değiştirilecek. - dpp
Bu, charAt 4 ile aynı olan tüm karakterlerin yerini alacaktır. - Shripad Bhat
Sorun: myName.replace(myName.charAt(5),'x') sana vereceğim dxmanxkzMuhtemelen gerekli olan değil. - Dawood ibn Kareem