कोडजिम युनिव्हर्सिटी कोर्सचा एक भाग म्हणून मार्गदर्शकासह व्याख्यान स्निपेट. पूर्ण अभ्यासक्रमासाठी साइन अप करा.


"हाय, अमिगो! आज आम्ही स्ट्रिंगसह काम करणाऱ्या आणखी काही सामान्य परिस्थितींचे विश्लेषण करू. उदाहरणार्थ, स्ट्रिंगला अनेक भागांमध्ये कसे विभाजित करावे हे तुम्हाला माहीत आहे का?"

"मी तुला लगेच सांगणार नाही, एली. पण तू मला सांगशील ना?"

split()पद्धत

"हे करण्याचे अनेक मार्ग आहेत. स्ट्रिंगला अनेक भागांमध्ये विभाजित करण्याचा पहिला मार्ग म्हणजे पद्धत वापरणे split(). विशिष्ट सीमांकन स्ट्रिंग परिभाषित करणारी रेग्युलर एक्स्प्रेशन पॅरामीटर म्हणून पास करणे आवश्यक आहे. रेग्युलर एक्सप्रेशन काय आहे ते तुम्ही शिकाल. Java संग्रह शोध.

उदाहरण:

कोड परिणाम
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);

जेथे स्ट्रिंग भागांमध्ये विभागली जाणारी स्ट्रिंग आहे. आणि सीमांकक ही एक स्ट्रिंग आहे, आणि त्यातील प्रत्येक वर्ण हा परिसीमक मानला जातो. उदाहरण:

कोड कन्सोल आउटपुट
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 " ऐवजी " % 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"दुसरे, सर्व समान स्ट्रिंग लिटरल्स फक्त एकदाच मेमरीमध्ये संग्रहित केले जाणे आवश्यक आहे. आणि ते कसे कार्य करते. जेव्हा तुमचा वर्ग कोड Java मशीनद्वारे लोड केला जातो, तेव्हा सर्व स्ट्रिंग लिटरल्स आधीपासून तेथे नसल्यास जोडले जातात. जर ते असतील तर आधीपासून आहे, नंतर आम्ही फक्त वरून स्ट्रिंग संदर्भ वापरतो 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()स्ट्रिंगमध्ये जोडेल आणि मधील स्ट्रिंगचा संदर्भ देईल .StringPoolStringPool

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

आपण ही पद्धत अनेकदा वापरण्याची शक्यता नाही. ते म्हणाले, लोकांना नोकरीच्या मुलाखतींमध्ये याबद्दल विचारणे आवडते.

"म्हणून, न कळण्यापेक्षा त्याबद्दल जाणून घेणे चांगले. धन्यवाद, एली!"