কোডজিম ইউনিভার্সিটি কোর্সের অংশ হিসাবে একজন পরামর্শদাতার সাথে একটি বক্তৃতা স্নিপেট। সম্পূর্ণ কোর্সের জন্য সাইন আপ করুন।


"হাই, অ্যামিগো! আজ আমরা স্ট্রিংগুলির সাথে কাজ করার সাথে জড়িত আরও কয়েকটি সাধারণ পরিস্থিতি বিশ্লেষণ করব৷ উদাহরণস্বরূপ, আপনি কি জানেন কিভাবে একটি স্ট্রিংকে কয়েকটি অংশে বিভক্ত করতে হয়?"

"আমি এখনই তোমাকে বলতে যাচ্ছি না, এলি। কিন্তু তুমি আমাকে বলবে, তাই না?"

split()পদ্ধতি

"এটি করার বিভিন্ন উপায় রয়েছে৷ একটি স্ট্রিংকে একাধিক অংশে বিভক্ত করার প্রথম উপায় হল পদ্ধতিটি ব্যবহার করা৷ split()একটি নিয়মিত অভিব্যক্তি যা একটি বিশেষ সীমাবদ্ধ স্ট্রিংকে সংজ্ঞায়িত করে একটি প্যারামিটার হিসাবে পাস করতে হবে৷ আপনি শিখবেন একটি রেগুলার এক্সপ্রেশন কী জাভা সংগ্রহ অনুসন্ধান.

উদাহরণ:

কোড ফলাফল
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
ফলাফল তিনটি স্ট্রিং একটি অ্যারে হবে:
["Good ", "ws everyo", "!"]

সহজ, কিন্তু কখনও কখনও এই পদ্ধতির অত্যধিক হয়. যদি অনেকগুলি সীমাবদ্ধতা থাকে (উদাহরণস্বরূপ, স্পেস, নিউলাইন অক্ষর, ট্যাব, পিরিয়ড), তাহলে আপনাকে একটি বরং জটিল রেগুলার এক্সপ্রেশন তৈরি করতে হবে।"

"ঠিক আছে, নিশ্চিত। এবং যদি এটি পড়া কঠিন হয়, তাহলে পরিবর্তন করা কঠিন।

StringTokenizerক্লাস

কোডজিম ইউনিভার্সিটি কোর্সের অংশ হিসাবে একজন পরামর্শদাতার সাথে একটি বক্তৃতা স্নিপেট। সম্পূর্ণ কোর্সের জন্য সাইন আপ করুন।


"জাভার একটি বিশেষ শ্রেণী রয়েছে যার পুরো কাজ হল একটি স্ট্রিংকে সাবস্ট্রিংয়ে বিভক্ত করা।

"এই ক্লাসটি রেগুলার এক্সপ্রেশন ব্যবহার করে না: পরিবর্তে, আপনি কেবল সীমাবদ্ধ স্ট্রিংয়ে পাস করেন এক সময়ে পদক্ষেপ

ক্লাসের একটি কনস্ট্রাক্টর এবং দুটি পদ্ধতি রয়েছে। আমরা কন্সট্রাকটরকে একটি স্ট্রিং পাস করি যা আমরা অংশে বিভক্ত করি, এবং একটি স্ট্রিং যা সীমাবদ্ধ অক্ষরের একটি সেট নিয়ে গঠিত।

পদ্ধতি বর্ণনা
String nextToken()
পরবর্তী সাবস্ট্রিং প্রদান করে
boolean hasMoreTokens()
আরও সাবস্ট্রিং আছে কিনা তা পরীক্ষা করে।

"এই ক্লাসটি একরকম আমাকে স্ক্যানার ক্লাসের কথা মনে করিয়ে দেয়, যার রয়েছে nextLine()এবং hashNextLine()পদ্ধতিও।

"এটি আপনার করা ভাল পর্যবেক্ষণ। আপনি StringTokenizerএই কমান্ড দিয়ে একটি বস্তু তৈরি করতে পারেন:

StringTokenizer name = new StringTokenizer(string, delimiters);

যেখানে স্ট্রিংকে স্ট্রিংকে ভাগে ভাগ করতে হবে। এবং delimiters একটি স্ট্রিং, এবং এটি প্রতিটি অক্ষর একটি বিভাজক হিসাবে গণ্য করা হয়. উদাহরণ:

কোড কনসোল আউটপুট
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

"উল্লেখ্য যে স্ট্রিংটির প্রতিটি অক্ষর দ্বিতীয় স্ট্রিংটিতে StringTokenizerকনস্ট্রাক্টরের কাছে পাস করা একটি বিভাজক হিসাবে বিবেচিত হয়৷

String.format()পদ্ধতি এবং StringFormatterক্লাস

"স্ট্রিং ক্লাসের আরেকটি আকর্ষণীয় পদ্ধতি হল format().

"আসুন ধরুন আপনার কাছে বিভিন্ন ভেরিয়েবল ডেটা সঞ্চয় করছে। আপনি কীভাবে সেগুলিকে এক লাইনে স্ক্রিনে প্রদর্শন করবেন? উদাহরণস্বরূপ, আমাদের কাছে কিছু ডেটা (বাম কলাম) এবং পছন্দসই আউটপুট (ডান কলাম) রয়েছে:

কোড কনসোল আউটপুট
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

এই জাতীয় প্রোগ্রামের কোডটি এরকম কিছু দেখাবে:

প্রোগ্রাম কোড
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

"আপনি আমার সাথে একমত হবেন যে কোডটি খুব পঠনযোগ্য নয়৷ এবং যদি পরিবর্তনশীল নামগুলি দীর্ঘ হয়, তাহলে কোডটি আরও কঠিন হয়ে উঠবে:

প্রোগ্রাম কোড
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

"হ্যাঁ, এটি একটি কঠিন পড়া!"

"চিন্তা করবেন না৷ বাস্তব-বিশ্বের প্রোগ্রামগুলিতে এটি একটি সাধারণ পরিস্থিতি, তাই আমি আপনাকে এই কোডটি আরও সহজ এবং আরও সংক্ষিপ্তভাবে লেখার একটি উপায় সম্পর্কে বলতে চাই৷

String.format

" Stringক্লাসের একটি স্ট্যাটিক format()পদ্ধতি রয়েছে: এটি আপনাকে ডেটা সহ একটি স্ট্রিং একত্রিত করার জন্য একটি প্যাটার্ন নির্দিষ্ট করতে দেয়৷ কমান্ডের সাধারণ চেহারাটি নিম্নরূপ:

String name = String.format(pattern, parameters);

উদাহরণ:

কোড ফলাফল
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

" পদ্ধতির প্রথম প্যারামিটার হল একটি ফরম্যাট স্ট্রিং যাতে আপনার ডেটা সন্নিবেশ করাতে প্রয়োজন এমন জায়গায় ফর্ম্যাট স্পেসিফায়ার (যেমন এবং ) format()নামে বিশেষ অক্ষর সহ সমস্ত পছন্দসই পাঠ্য থাকে৷%d%s

" format()পদ্ধতিটি এই %sএবং %dফরম্যাট স্পেসিফায়ারগুলিকে প্যারামিটার তালিকায় ফর্ম্যাট স্ট্রিংকে অনুসরণ করে এমন প্যারামিটারগুলির সাথে প্রতিস্থাপন করে৷ যদি আমরা একটি স্ট্রিং সন্নিবেশ করতে চাই, তাহলে আমরা লিখি৷ %sযদি আমরা একটি সংখ্যা সন্নিবেশ করতে চাই, তাহলে বিন্যাস নির্দিষ্টকারী হল %d৷ উদাহরণ:

কোড ফলাফল
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sসমান"a=1, b=4, c=3"

"এখানে বিন্যাস নির্দিষ্টকরণের একটি সংক্ষিপ্ত তালিকা যা বিন্যাস স্ট্রিং এর ভিতরে ব্যবহার করা যেতে পারে:

স্পেসিফায়ার অর্থ
%s
String
%d
interger: byte, short, int,long
%f
প্রকৃত সংখ্যা float:,double
%b
boolean
%c
char
%t
Date
%%
%চরিত্র

"এই স্পেসিফায়ারগুলি ডেটার ধরন নির্দেশ করে, তবে এমন কিছু নির্দিষ্টকারীও রয়েছে যা ডেটার ক্রম নির্দেশ করে৷ এর সংখ্যা দ্বারা একটি আর্গুমেন্ট পেতে (সংখ্যা একটি থেকে শুরু হয়), আপনাকে " % 1$ d " এর পরিবর্তে লিখতে হবে %d "। উদাহরণ:

কোড ফলাফল
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sসমান"a=13, b=12, c=11"

%3$d3য় আর্গুমেন্ট পাবেন, %2$dদ্বিতীয় আর্গুমেন্ট পাবেন এবং %dপ্রথম আর্গুমেন্ট পাবেন। এবং %sফর্ম্যাট %dস্পেসিফায়ারগুলি আর্গুমেন্টগুলিকে নির্দেশ করে যেমন নির্দিষ্টকারী নির্বিশেষে %3$dবা%2$s

স্ট্রিং পুল

"কোডে স্ট্রিং লিটারাল হিসাবে নির্দিষ্ট করা প্রতিটি স্ট্রিং মেমরির একটি এলাকায় সংরক্ষিত থাকে যাকে StringPoolপ্রোগ্রামটি চলাকালীন বলা হয়। StringPoolস্ট্রিং সংরক্ষণের জন্য একটি বিশেষ অ্যারে। এর উদ্দেশ্য হল স্ট্রিং স্টোরেজ অপ্টিমাইজ করা:

"প্রথম, কোডে নির্দিষ্ট করা স্ট্রিংগুলিকে অবশ্যই কোথাও সংরক্ষণ করতে হবে, তাই না? কোডে কমান্ড থাকে, কিন্তু ডেটা (বিশেষ করে, বড় স্ট্রিংগুলি) কোড থেকে আলাদাভাবে মেমরিতে সংরক্ষণ করা আবশ্যক৷ কোডে শুধুমাত্র স্ট্রিং অবজেক্টের উল্লেখগুলি উপস্থিত হয়৷

"দ্বিতীয়, সমস্ত অভিন্ন স্ট্রিং লিটারেলকে শুধুমাত্র একবার মেমরিতে সংরক্ষণ করতে হবে। এবং এটি ঠিক এইভাবে কাজ করে। যখন আপনার ক্লাস কোড জাভা মেশিন দ্বারা লোড করা হয়, তখন সমস্ত স্ট্রিং লিটারেল যোগ করা হয় যদি সেগুলি ইতিমধ্যে সেখানে না থাকে StringPool। ইতিমধ্যেই আছে, তারপর আমরা কেবল থেকে একটি স্ট্রিং রেফারেন্স ব্যবহার করি StringPool

তদনুসারে, আপনি যদি আপনার কোডের বেশ কয়েকটি স্ট্রিং ভেরিয়েবলে একই আক্ষরিক বরাদ্দ করেন, তবে এই ভেরিয়েবলগুলিতে একই রেফারেন্স থাকবে। একটি আক্ষরিক শুধুমাত্র একবার যোগ করা হবে StringPool. অন্য সব ক্ষেত্রে, কোডটি ইতিমধ্যেই লোড করা স্ট্রিংয়ের একটি রেফারেন্স পাবে StringPool

এটি মোটামুটিভাবে কীভাবে কাজ করে তা এখানে:

কোড StringPoll এর সাথে কাজ করা
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

"তাই aএবং bভেরিয়েবল একই রেফারেন্স সংরক্ষণ করবে।"

"আমি আশা করি আমি এটি সঠিকভাবে বুঝতে পেরেছি।

intern()পদ্ধতি

"এবং সর্বোত্তম অংশ হল যে আপনি প্রোগ্রামে যেকোন স্ট্রিং যোগ করতে পারেন StringPool। এটি করার জন্য, আপনাকে শুধুমাত্র Stringভেরিয়েবলের intern()পদ্ধতিতে কল করতে হবে।

" intern()পদ্ধতিটি স্ট্রিংটিকে যুক্ত করবে StringPoolযদি এটি ইতিমধ্যে সেখানে না থাকে, এবং স্ট্রিংটিতে একটি রেফারেন্স ফিরিয়ে দেবে StringPool

StringPool"এবং পদ্ধতি ব্যবহার করে দুটি অভিন্ন স্ট্রিং যোগ করা হলে কি হবে intern()?"

"পদ্ধতিটি একই রেফারেন্স ফিরিয়ে দেবে। এটি রেফারেন্স দ্বারা স্ট্রিং তুলনা করতে ব্যবহার করা যেতে পারে। উদাহরণ:

কোড বিঃদ্রঃ
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

আপনি প্রায়ই এই পদ্ধতি ব্যবহার করার সম্ভাবনা নেই. যে বলে, লোকেরা চাকরির সাক্ষাত্কারে এটি সম্পর্কে জিজ্ঞাসা করতে পছন্দ করে।

"সুতরাং, না জানার চেয়ে এটি সম্পর্কে জানা ভাল। ধন্যবাদ, এলি!"