Codegym यूनिवर्सिटी कोर्स के भाग के रूप में एक परामर्शदाता के साथ एक व्याख्यान स्निपेट। पूर्ण पाठ्यक्रम के लिए साइन अप करें।


"हाय, अमीगो! आज हम कुछ और सामान्य परिदृश्यों का विश्लेषण करेंगे जिनमें स्ट्रिंग्स के साथ काम करना शामिल है। उदाहरण के लिए, क्या आप जानते हैं कि स्ट्रिंग को कई भागों में कैसे विभाजित किया जाता है?"

"मैं तुम्हें अभी नहीं बता रहा हूँ, ऐली। लेकिन तुम मुझे बताने जा रहे हो, है ना?"

split()तरीका

"ऐसा करने के कई तरीके हैं। एक स्ट्रिंग को कई भागों में विभाजित करने का पहला तरीका विधि का उपयोग करना है। split()एक विशेष परिसीमन स्ट्रिंग को परिभाषित करने वाली एक नियमित अभिव्यक्ति को एक पैरामीटर के रूप में पारित किया जाना चाहिए। आप सीखेंगे कि एक नियमित अभिव्यक्ति क्या है जावा संग्रह खोज।

उदाहरण:

कोड परिणाम
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
नतीजा तीन तारों की एक सरणी होगी:
["Good ", "ws everyo", "!"]

सरल, लेकिन कभी-कभी यह दृष्टिकोण अत्यधिक होता है। यदि बहुत सारे डिलीमीटर हैं (उदाहरण के लिए, रिक्त स्थान, न्यूलाइन वर्ण, टैब, अवधि), तो आपको एक जटिल नियमित अभिव्यक्ति बनाना होगा।"

"ठीक है, ज़रूर। और अगर इसे पढ़ना मुश्किल है, तो बदलाव करना भी मुश्किल है।

StringTokenizerकक्षा

Codegym यूनिवर्सिटी कोर्स के भाग के रूप में एक परामर्शदाता के साथ एक व्याख्यान स्निपेट। पूर्ण पाठ्यक्रम के लिए साइन अप करें।


"जावा का एक विशेष वर्ग है जिसका पूरा काम स्ट्रिंग को सबस्ट्रिंग्स में विभाजित करना है।

"यह वर्ग नियमित अभिव्यक्तियों का उपयोग नहीं करता है: इसके बजाय, आप बस सीमांकक से युक्त एक स्ट्रिंग में पास होते हैं। इस दृष्टिकोण का लाभ यह है कि यह पूरे स्ट्रिंग को एक ही बार में टुकड़ों में नहीं तोड़ता है, बल्कि इसके बजाय शुरू से अंत तक चलता है। एक समय में कदम।

कक्षा में एक कंस्ट्रक्टर और दो विधियाँ हैं। हम कंस्ट्रक्टर को एक स्ट्रिंग पास करते हैं जिसे हम भागों में विभाजित करते हैं, और एक स्ट्रिंग जिसमें परिसीमन वर्णों का एक सेट होता है।

तरीकों विवरण
String nextToken()
अगला सबस्ट्रिंग लौटाता है
boolean hasMoreTokens()
जाँचता है कि क्या अधिक सबस्ट्रिंग हैं।

"यह वर्ग किसी तरह मुझे स्कैनर वर्ग की याद दिलाता है, जिसमें विधियाँ nextLine()भी हैं।hashNextLine()

"आपने यह अच्छा अवलोकन किया है। आप StringTokenizerइस आदेश के साथ एक वस्तु बना सकते हैं:

StringTokenizer name = new StringTokenizer(string, 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
इंटरजर: byte, short, int,long
%f
वास्तविक संख्या: float,double
%b
boolean
%c
char
%t
Date
%%
%चरित्र

"ये विनिर्देशक डेटा के प्रकार को इंगित करते हैं, लेकिन ऐसे विनिर्देशक भी हैं जो डेटा के क्रम को इंगित करते हैं। इसकी संख्या से एक तर्क प्राप्त करने के लिए (संख्या एक से शुरू होती है), आपको "% 1$ d" के बजाय "% 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$dतीसरा तर्क मिलेगा, %2$dदूसरा तर्क मिलेगा, और %dपहला तर्क मिलेगा। और प्रारूप विनिर्देशक या जैसे निर्दिष्टकर्ताओं की परवाह किए बिना तर्कों को संदर्भित करते %sहैं%d%3$d%2$s

स्ट्रिंग पूल

"एक स्ट्रिंग शाब्दिक के रूप में कोड में निर्दिष्ट प्रत्येक स्ट्रिंग को स्मृति के एक क्षेत्र में संग्रहीत किया जाता है, जिसे StringPoolप्रोग्राम चल रहा है। StringPoolस्ट्रिंग्स को संग्रहीत करने के लिए एक विशेष सरणी है। इसका उद्देश्य स्ट्रिंग स्टोरेज को अनुकूलित करना है:

"सबसे पहले, कोड में निर्दिष्ट स्ट्रिंग्स को कहीं संग्रहीत किया जाना चाहिए, है ना? कोड में कमांड होते हैं, लेकिन डेटा (विशेष रूप से, बड़े स्ट्रिंग्स) को कोड से अलग मेमोरी में संग्रहीत किया जाना चाहिए। केवल स्ट्रिंग ऑब्जेक्ट्स के संदर्भ कोड में दिखाई देते हैं।

"दूसरा, सभी समान स्ट्रिंग लिटरल को केवल एक बार मेमोरी में संग्रहित किया जाना चाहिए। और बस इसी तरह यह काम करता है। जब आपका क्लास कोड जावा मशीन द्वारा लोड किया जाता है, तो सभी स्ट्रिंग लिटरल को इसमें जोड़ दिया जाता है यदि वे पहले से ही वहां नहीं हैं। यदि वे StringPoolहैं पहले से ही वहाँ है, तो हम बस एक स्ट्रिंग संदर्भ का उपयोग करते हैं StringPool

तदनुसार, यदि आप अपने कोड में कई स्ट्रिंग चरों के लिए एक ही शाब्दिक निर्दिष्ट करते हैं, तो इन चरों में एक ही संदर्भ होगा। StringPoolएक अक्षर केवल एक बार जोड़ा जाएगा । अन्य सभी मामलों में, कोड को पहले से लोड की गई स्ट्रिंग का संदर्भ मिलेगा StringPool

यहाँ मोटे तौर पर यह कैसे काम करता है:

कोड स्ट्रिंगपोल के साथ काम करना
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

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

"तो, इसके बारे में जानना बेहतर है न जानने से। धन्यवाद, ऐली!"