एक स्ट्रिंग में एक विशिष्ट सूचकांक में एक चरित्र को बदलें?


382

मैं एक स्ट्रिंग में एक विशिष्ट सूचकांक में एक चरित्र को बदलने की कोशिश कर रहा हूं।

मैं क्या कर रहा हूँ:

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

यह एक त्रुटि देता है। क्या ऐसा करने का कोई तरीका है?


12
मुझे लगता है कि यह मौत के लिए उत्तर दिया गया है, लेकिन यह ध्यान देने योग्य है कि इसे जावा में एक फ़ंक्शन कॉल के परिणाम को असाइन करने की अनुमति नहीं है । C ((?) और C ++ के संदर्भ जैसी कोई चीज़ नहीं हैं।
अप्रूवलडार्कनेसफिश

1
VB में @ValekHalfHeart, आप किसी सरणी के अनुक्रमणिका तक पहुँचने के लिए कोष्ठक का उपयोग करते हैं, यही कारण है कि जब मैं जावा में शुरू कर रहा था तो मुझे भ्रम हो सकता है: D
dpp

@ApproachingDarknessFish मुझे यकीन नहीं है कि आपके द्वारा इसका मतलब यह है कि "जावा में फ़ंक्शन कॉल के परिणाम को कभी भी निर्दिष्ट करने की अनुमति नहीं है"। निश्चित रूप से आप कर सकते हैं double r = Math.sin(3.14)? यह इस प्रश्न से कैसे संबंधित है? धन्यवाद।
222 बजे flow2k

1
@ flow2k ओह जीज, पुरानी टिप्पणी तो मैं संपादित नहीं कर सकता, लेकिन यह एक टाइपो है, यह कहना चाहिए कि "यह जावा में फ़ंक्शन कॉल के परिणाम को असाइन करने की अनुमति नहीं है "। यानी आप "फू = बार ();" लेकिन कभी नहीं "बार () = फू;"।
ApproachingDarknessFish

स्पष्टीकरण के लिए धन्यवाद @ApproachingDarknessFish। मुझे लगता है कि किसी फ़ंक्शन के परिणाम के लिए कुछ असाइन करना अजीब होगा - क्या ऐसी भाषाएं हैं जो वास्तव में इसकी अनुमति देती हैं? मुझे आश्चर्य है कि उपयोग का मामला क्या होगा।
flow2k

जवाबों:


566

स्ट्रिंग जावा में अपरिवर्तनीय हैं। आप उन्हें बदल नहीं सकते।

आपको प्रतिस्थापित चरित्र के साथ एक नया स्ट्रिंग बनाने की आवश्यकता है।

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

3
आह, आपका मतलब उस replaceविधि की तरह है जो स्ट्रिंग को संशोधित नहीं करेगा लेकिन क्या केवल एक नया स्ट्रिंग लौटाएगा?
डीपीपी

1
यह थोड़े जटिल मिस्टरपेट है। क्या आप इसे करने का सबसे अच्छा तरीका है? आह, मैंने पहले StringBuilder के बारे में सुना है, क्या इससे कोई फर्क पड़ता है? क्या यह मुझे एक आसान तरीका देगा?
डीपीपी

158

स्ट्रिंग को चार [] में बदल दें, पत्र को इंडेक्स से बदलें, फिर सरणी को वापस स्ट्रिंग में परिवर्तित करें।

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

1
इस घोल से प्यार करें। मैंने myNameChars [index] = character.toCharArray () [0] होने के लिए तीसरी पंक्ति को बदलना समाप्त कर दिया; सरलीकरण के लिए। अच्छा समाधान।
डेल

2
यह अन्य बदसूरत एक की तुलना में बहुत अच्छा लगता हैmyName.substring(0,4)+'x'+myName.substring(5);
user924

यह बहुत अधिक सरल है
शिवा अचार्जी

19

Stringजावा में एक अपरिवर्तनीय वर्ग है। कोई भी तरीका जो इसे संशोधित करता है वह हमेशा संशोधन के साथ एक नया स्ट्रिंग ऑब्जेक्ट देता है।

यदि आप एक स्ट्रिंग में हेरफेर करना चाहते हैं, तो विचार करें StringBuilderया StringBufferमामले में आपको थ्रेड सुरक्षा की आवश्यकता होती है।


12

मैं पेटार इवानोव के साथ सहमत हूं लेकिन अगर हम निम्नलिखित तरीके से लागू करते हैं तो यह सबसे अच्छा है:

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

21
और क्या आपके समाधान बेहतर बनाता है?
डीपीपी

6

जैसा कि पहले यहां बताया गया है, 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();
    }
}

4

आप एक स्ट्रिंग को अधिलेखित कर सकते हैं, निम्नानुसार है:

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

ध्यान दें कि स्ट्रिंग myNameदोनों लाइनों पर और दूसरी पंक्ति के दोनों किनारों पर होती है।

इसलिए, भले ही तार तकनीकी रूप से अपरिवर्तनीय हो सकते हैं, व्यवहार में, आप उन्हें अधिलेखित करके संपादन योग्य मान सकते हैं।


मैंने आपके उत्तर को अस्वीकार नहीं किया है, लेकिन मुझे स्वीकार करना चाहिए कि मुझे "ओवरराइट" शब्द के साथ एक समस्या है (हालांकि मुझे लगता है कि हम इसके पीछे की अवधारणा पर सहमत हैं)। वस्तु स्वयं अपरिवर्तित रहती है। आप बस अपने चर संदर्भ को एक और वस्तु बनाते हैं। वैसे यह उल्लेख करना दिलचस्प है कि आप अपने उदाहरण में कम से कम चार स्ट्रिंग उदाहरण बनाते हैं।
सी। शेम्पेन

0

पहली बात जो मैंने देखी होगी, वह charAtयह है कि एक विधि है और समान संकेत का उपयोग करके इसे मान देना कुछ भी नहीं करेगा। यदि कोई स्ट्रिंग अपरिवर्तनीय है, charAtतो स्ट्रिंग ऑब्जेक्ट में परिवर्तन करने के लिए विधि, नए वर्ण वाले तर्क को प्राप्त करना चाहिए। दुर्भाग्य से, स्ट्रिंग अपरिवर्तनीय है। स्ट्रिंग को संशोधित करने के लिए, मुझे श्री पीटर इवानोव द्वारा सुझाए गए अनुसार स्ट्रिंगबर्ल का उपयोग करने की आवश्यकता थी।


-7

यह काम करेगा

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

आउटपुट: डोमैक्सोकज़


1
यद्यपि मैं दृढ़ता से इस StackOverFlow साइट पर अन्य कार्यों के "संपादन" की अनुमति देने के इस तरीके का विरोध करता हूं। पूरी तरह से अनुचित: /
डायबोलस इनफर्नेलिस

2
वक्य रचना त्रुटि। और सही होने पर भी, मैं कहता हूं कि मैं पहले 'o' को 'x' से बदलना चाहता हूं, दूसरे 'o' को भी बदल दिया जाएगा।
dpp

2
यह सभी वर्णों को बदल देगा जो कि charAt 4 के समान है।
श्रीपाद भट्ट

1
समस्या: myName.replace(myName.charAt(5),'x')आपको देगा dxmanxkz, जो कि आवश्यक नहीं है।
दाऊद इब्न करीम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.