একটি স্ট্রিংয়ের একটি নির্দিষ্ট সূচীতে একটি অক্ষর প্রতিস্থাপন করবেন?


382

আমি একটি স্ট্রিংয়ের একটি নির্দিষ্ট সূচকে একটি অক্ষর প্রতিস্থাপন করার চেষ্টা করছি।

আমি যা করছি তা হ'ল:

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

এটি একটি ত্রুটি দেয়। এটি করার কোনও পদ্ধতি আছে?


12
আমি বুঝতে পারি এটির মৃত্যুর জবাব দেওয়া হয়েছে, তবে এটি লক্ষণীয় যে এটি কখনও জাভাতে কোনও ফাংশন কলের ফলাফল নির্ধারণের অনুমতি দেয় না । সি (?) এবং সি ++ এর উল্লেখের মতো জিনিস নেই।
ডার্কনেসফিশ 0

1
ভিবিতে ভালেকহাল্ফ হার্ট, আপনি অ্যারের সূচীটি অ্যাক্সেসের জন্য প্রথম বন্ধনী ব্যবহার করেছেন, এটি জাভাতে শুরু করার সময় আমি বিভ্রান্ত হওয়ার কারণ হতে পারে: ডি
ডিপিপি

@ অ্যাপোরিচিং ডার্কনেসফিশ আমি আপনাকে "জাভাতে কোনও ফাংশন কলের ফলাফল নির্ধারণের অনুমতি দেয় না" এর দ্বারা কী বোঝাতে চাইছে তা নিশ্চিত নই। নিশ্চয়ই আপনি করতে পারেন double r = Math.sin(3.14)? এটি এই প্রশ্নের সাথে কীভাবে সম্পর্কিত? ধন্যবাদ।
ফ্লো

1
@ flow2k ওহ বলছোটা পুরাতন মন্তব্য তাই আমি সম্পাদনা করতে পারবেন না কিন্তু একটি টাইপো যে, এটা বলা উচিত যে, "এটা নির্ধারণ করার অনুমতি দেওয়া হয় না করতে জাভা একটি ফাংশন কল ফল"। অর্থাৎ আপনি "foo = বার ()" লিখতে পারেন; তবে কখনই "বার () = foo;" নয়।
ApproachingDarknessFish

@ অ্যাপপ্রোচিংডার্কনেসফিশের স্পষ্টতার জন্য ধন্যবাদ। আমি মনে করি কোনও ফাংশনের ফলাফলের জন্য কিছু নির্ধারণ করা আশ্চর্যজনক হবে - এমন ভাষাগুলি রয়েছে যা আসলে এটির অনুমতি দেয়? আমি ভাবছি ব্যবহারের ক্ষেত্রে কী হবে।
ফ্লো

উত্তর:


566

স্ট্রিং জাভাতে পরিবর্তনযোগ্য। আপনি এগুলি পরিবর্তন করতে পারবেন না।

চরিত্রটি প্রতিস্থাপনের সাথে আপনাকে একটি নতুন স্ট্রিং তৈরি করতে হবে।

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

অথবা আপনি স্ট্রিংবিল্ডার ব্যবহার করতে পারেন:

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

System.out.println(myName);

3
আহ, আপনার অর্থ এমন replaceপদ্ধতির মতো যা স্ট্রিং সংশোধন করবে না তবে কেবল একটি নতুন স্ট্রিং ফিরিয়ে দেবে?
dpp

1
মিঃপিতর এটাই জটিল। আপনি কি এটি সেরা উপায়? আহ, আমি এর আগে স্ট্রিংবিল্ডারের কথা শুনেছি, তাতে কি কোনও পার্থক্য রয়েছে? এটি কি আমাকে আরও সহজ পদ্ধতি দেবে?
dpp

158

স্ট্রিংকে একটি চরে পরিণত করুন [], সূচি অনুসারে চিঠিটি প্রতিস্থাপন করুন, তারপরে অ্যারেটিকে আবার স্ট্রিংয়ে রূপান্তর করুন।

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

1
এই সমাধান ভালবাসা। আমি তৃতীয় লাইনটি আমার নামচর্চার [সূচক] = চরিত্রের জন্য পরিবর্তন করে শেষ করেছি to সরলকরণের জন্য। সুন্দর সমাধান।
ডেল

2
এটি অন্য myName.substring(0,4)+'x'+myName.substring(5);
কুরুচিপূর্ণর

এটি আরও সহজ
শিব আচার্জি

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
এবং কি আপনার সমাধান আরও ভাল করে তোলে?
dpp

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

আউটপুট: domaxokz


1
যদিও আমি এই স্ট্যাকওভারফ্লো সাইটে অন্যের কাজের "সম্পাদনাযোগ্যতা" মঞ্জুরি দেওয়ার এই পদ্ধতিটিকে তীব্রভাবে ঘৃণা করি। সম্পূর্ণরূপে অন্যায্য: /
ডায়াবলাস ইনফার্নালিস

2
বাক্যগঠন ত্রুটি. এমনকি যদি সংশোধন করা হয়, তবে বলুন যে আমি প্রথম 'ও' কে 'এক্স' দিয়ে প্রতিস্থাপন করতে চাই, দ্বিতীয় 'ও'ও প্রতিস্থাপন করা হবে।
dpp

2
এই সব চরিত্র যা charAt 4. হিসাবে একই প্রতিস্থাপন করবে
Shripad ভাট

1
সমস্যা: myName.replace(myName.charAt(5),'x')আপনাকে দেবে dxmanxkz, যা সম্ভবত যা প্রয়োজন তা নয়।
দাউদ ইবনে কেরেম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.