इसलिए मैं एक स्ट्रिंग में प्रत्येक वर्ण के लिए पुनरावृति करना चाहता हूं।
तो मैंने सोचा:
for (char c : "xyz")
लेकिन मुझे एक संकलक त्रुटि मिलती है:
MyClass.java:20: foreach not applicable to expression type
मैं यह कैसे कर सकता हूँ?
इसलिए मैं एक स्ट्रिंग में प्रत्येक वर्ण के लिए पुनरावृति करना चाहता हूं।
तो मैंने सोचा:
for (char c : "xyz")
लेकिन मुझे एक संकलक त्रुटि मिलती है:
MyClass.java:20: foreach not applicable to expression type
मैं यह कैसे कर सकता हूँ?
जवाबों:
करने के लिए-प्रत्येक हर सबसे आसान तरीका है char
एक में String
उपयोग करने के लिए है toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
यह आपको प्रत्येक निर्माण के लिए सहमति देता है, लेकिन दुर्भाग्य से String
(जो अपरिवर्तनीय है) char[]
(जो कि परिवर्तनशील है) उत्पन्न करने के लिए एक रक्षात्मक प्रतिलिपि का प्रदर्शन करना चाहिए , इसलिए कुछ लागत जुर्माना है।
से प्रलेखन :
[
toCharArray()
रिटर्न] एक नव आबंटित वर्ण सरणी, जिसकी लंबाई इस स्ट्रिंग की लंबाई है और जिसकी सामग्री को इस स्ट्रिंग द्वारा दर्शाए गए वर्ण अनुक्रम को समाहित करने के लिए आरम्भ किया गया है।
किसी सरणी में वर्णों पर पुनरावृत्ति करने के अधिक क्रियात्मक तरीके हैं (नियमित रूप से लूप CharacterIterator
, आदि के लिए), लेकिन यदि आप toCharArray()
प्रत्येक के लिए लागत का भुगतान करने को तैयार हैं, तो यह सबसे संक्षिप्त है।
toCharArray( )
में 3 बार कहा जाता है?
211900000
, पूरा होने for (char c : str.toCharArray()) { }
में लगने वाला समय ~ 250ms है और पूरा होने में लगने वाला समय for (char c : charArray) { }
<10ms है। बेशक, ये समय मान हार्डवेयर पर निर्भर करेगा, लेकिन टेकअवे एक विधि दूसरे की तुलना में काफी महंगा है।
toCharArray()
लूप बॉडी के अंदर नहीं है; यह केवल एक बार कहा जाता है, और फिर लूप उस परिणामी सरणी पर पुनरावृति करता है। (फॉर-प्रत्येक लूप सामान्य- for
लूप से भिन्न होता है , जो प्रत्येक पुनरावृत्ति को रोकने की स्थिति का मूल्यांकन करता है।)
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
एक और उपयोगी समाधान, आप स्ट्रिंग के सरणी के रूप में इस स्ट्रिंग के साथ काम कर सकते हैं
for (String s : "xyz".split("")) {
System.out.println(s);
}
split()
से अधिक जावा चरित्र के लिए मैप किया जा रहा है , जो लगभग सभी इमोटिकॉन्स के लिए मामला है। उदाहरण के लिए, आपके उदाहरण की यह विविधता तीन के बजाय चार बार लूप करेगी:for (String s : "x😁z".split("")) { System.out.println(s); }
आपको toCharArray
स्ट्रिंग क्लास के () विधि का उपयोग करके स्ट्रिंग ऑब्जेक्ट को चार के एक सरणी में बदलने की आवश्यकता है :
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
में जावा 8 हम इसे के रूप में हल कर सकते हैं:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
विधि वर्ण () डॉकIntStream
में उल्लिखित है :
इस क्रम से चार मानों को बढ़ाते हुए int शून्य की धारा लौटाता है। कोई भी चार्ट जो एक सरोगेट कोड बिंदु पर मैप करता है, उसे निर्बाध रूप से पारित किया जाता है। यदि धारा को पढ़ा जा रहा है, तो अनुक्रम उत्परिवर्तित है, परिणाम अपरिभाषित है।
forEachOrdered
और क्या नहीं forEach
?forEach
स्पष्ट रूप से nondeterministic का व्यवहार जहां forEachOrdered
धारा के मुठभेड़ क्रम में इस धारा के प्रत्येक तत्व के लिए एक क्रिया करता है, यदि धारा में एक मुठभेड़ आदेश है। इसलिए forEach
गारंटी नहीं देता कि ऑर्डर रखा जाएगा। इस प्रश्न की और भी जाँच करें ।
हम codePoints()
प्रिंट करने के लिए भी उपयोग कर सकते हैं , अधिक विवरण के लिए इस उत्तर को देखें।
दुर्भाग्य से जावा String
कार्यान्वयन नहीं करता है Iterable<Character>
। यह आसानी से किया जा सकता है। वहाँ है, StringCharacterIterator
लेकिन यह भी लागू नहीं करता है Iterator
... तो अपना खुद का बनाएँ:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
अब आप (कुछ) आसानी से दौड़ सकते हैं for (char c : new CharSequenceCharacterIterable("xyz"))
...
आप जावा 8 का उपयोग करते हैं, तो आप उपयोग कर सकते हैं chars()
एक पर String
एक पाने के लिए Stream
पात्रों में से है, लेकिन आप कास्ट करने के लिए की आवश्यकता होगी int
एक वापस करने के लिए char
के रूप में chars()
रिटर्न एक IntStream
।
"xyz".chars().forEach(i -> System.out.print((char)i));
यदि आप एक्लिप्स कलेक्शंस के साथ जावा 8 का उपयोग करते हैं, तो आप CharAdapter
क्लास forEach
मेथड का उपयोग लैम्बडा या मेथड रेफरेंस के साथ कर सकते हैं String
।
Strings.asChars("xyz").forEach(c -> System.out.print(c));
यह विशेष उदाहरण विधि संदर्भ का उपयोग भी कर सकता है।
Strings.asChars("xyz").forEach(System.out::print)
नोट: मैं ग्रहण संग्रहों के लिए एक कमिटेटर हूं।
आप इस मामले में एक लैम्ब्डा का भी उपयोग कर सकते हैं।
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
ट्रैवर्स के लिए एक स्ट्रिंग आप स्ट्रिंग के charAt()
साथ भी उपयोग कर सकते हैं ।
पसंद :
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
जावा में स्ट्रिंग हैंडलिंग की विधि है जो विशिष्ट चरित्र के लिए स्ट्रिंग को ट्रैवर्स में मदद करती है।
for (char st: "xyz".toCharArray()) {}
है?