मैं स्ट्रिंग में प्रत्येक वर्ण के लिए प्रत्येक लूप के लिए कैसे लागू करूं?


189

इसलिए मैं एक स्ट्रिंग में प्रत्येक वर्ण के लिए पुनरावृति करना चाहता हूं।

तो मैंने सोचा:

for (char c : "xyz")

लेकिन मुझे एक संकलक त्रुटि मिलती है:

MyClass.java:20: foreach not applicable to expression type

मैं यह कैसे कर सकता हूँ?

जवाबों:


333

करने के लिए-प्रत्येक हर सबसे आसान तरीका है charएक में Stringउपयोग करने के लिए है toCharArray():

for (char ch: "xyz".toCharArray()) {
}

यह आपको प्रत्येक निर्माण के लिए सहमति देता है, लेकिन दुर्भाग्य से String(जो अपरिवर्तनीय है) char[](जो कि परिवर्तनशील है) उत्पन्न करने के लिए एक रक्षात्मक प्रतिलिपि का प्रदर्शन करना चाहिए , इसलिए कुछ लागत जुर्माना है।

से प्रलेखन :

[ toCharArray()रिटर्न] एक नव आबंटित वर्ण सरणी, जिसकी लंबाई इस स्ट्रिंग की लंबाई है और जिसकी सामग्री को इस स्ट्रिंग द्वारा दर्शाए गए वर्ण अनुक्रम को समाहित करने के लिए आरम्भ किया गया है।

किसी सरणी में वर्णों पर पुनरावृत्ति करने के अधिक क्रियात्मक तरीके हैं (नियमित रूप से लूप CharacterIterator, आदि के लिए), लेकिन यदि आप toCharArray()प्रत्येक के लिए लागत का भुगतान करने को तैयार हैं, तो यह सबसे संक्षिप्त है।


1
क्या कंपाइलर यह पहचान सकेगा कि एक सच्ची कॉपी की आवश्यकता नहीं है और क्या उपयुक्त अनुकूलन को लागू करता है?
पचेरियर

1
@Pacerier नहीं, वर्तमान जावा कंपाइलर कभी भी कोड का अनुकूलन नहीं करेगा।
RAnders00

1
@ RAnders00 तो, इस मामले toCharArray( )में 3 बार कहा जाता है?
डेन्वरकोडर 9

1
स्ट्रिंग की लंबाई के साथ 211900000, पूरा होने for (char c : str.toCharArray()) { }में लगने वाला समय ~ 250ms है और पूरा होने में लगने वाला समय for (char c : charArray) { }<10ms है। बेशक, ये समय मान हार्डवेयर पर निर्भर करेगा, लेकिन टेकअवे एक विधि दूसरे की तुलना में काफी महंगा है।
डेनवरकोडर 9

7
@ रफीदुज्जमानसोनेट: नहीं, toCharArray()लूप बॉडी के अंदर नहीं है; यह केवल एक बार कहा जाता है, और फिर लूप उस परिणामी सरणी पर पुनरावृति करता है। (फॉर-प्रत्येक लूप सामान्य- forलूप से भिन्न होता है , जो प्रत्येक पुनरावृत्ति को रोकने की स्थिति का मूल्यांकन करता है।)
नहीं-यति-यति

50
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
   char c = s.charAt(i);
}

 


7
ओपी को लूप के लिए उम्मीद है।
अमितग

3
नीचे मतदान हुआ क्योंकि यह विशेष रूप से ओपी के लिए क्या नहीं है। हालांकि यह एक वैध समाधान है, यह पूरी तरह से वह नहीं है जो पूछा जा रहा है
सायरन

1
कोई फर्क नहीं पड़ता कि ओपी को क्या उम्मीद थी, यह मेरे लिए बेहतर प्रदर्शन से प्रत्येक का अनुमान है।
एरिक वांग

9

एक और उपयोगी समाधान, आप स्ट्रिंग के सरणी के रूप में इस स्ट्रिंग के साथ काम कर सकते हैं

for (String s : "xyz".split("")) {
    System.out.println(s);
}

सुरुचिपूर्ण, लेकिन दुर्भाग्य से यह काम नहीं करता है यदि स्ट्रिंग के किसी भी तत्व को एक split()से अधिक जावा चरित्र के लिए मैप किया जा रहा है , जो लगभग सभी इमोटिकॉन्स के लिए मामला है। उदाहरण के लिए, आपके उदाहरण की यह विविधता तीन के बजाय चार बार लूप करेगी:for (String s : "x😁z".split("")) { System.out.println(s); }
skomisa

5

आपको 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);
}

4

में जावा 8 हम इसे के रूप में हल कर सकते हैं:

String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));    

विधि वर्ण () डॉकIntStream में उल्लिखित है :

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

क्यों इस्तेमाल करें forEachOrderedऔर क्या नहीं forEach?

forEachस्पष्ट रूप से nondeterministic का व्यवहार जहां forEachOrderedधारा के मुठभेड़ क्रम में इस धारा के प्रत्येक तत्व के लिए एक क्रिया करता है, यदि धारा में एक मुठभेड़ आदेश है। इसलिए forEachगारंटी नहीं देता कि ऑर्डर रखा जाएगा। इस प्रश्न की और भी जाँच करें ।

हम codePoints()प्रिंट करने के लिए भी उपयोग कर सकते हैं , अधिक विवरण के लिए इस उत्तर को देखें।


यह कई ऑब्जेक्ट्स बनाता है, इसलिए यह उत्तर कैविटी के बिना पूरा नहीं होता है कि यह एक साधारण अनुक्रमित लूप की तुलना में कम कुशल हो सकता है।
toolforger

4

दुर्भाग्य से जावा 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"))...


3

आप जावा 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)

नोट: मैं ग्रहण संग्रहों के लिए एक कमिटेटर हूं।


1

आप इस मामले में एक लैम्ब्डा का भी उपयोग कर सकते हैं।

    String s = "xyz";
    IntStream.range(0, s.length()).forEach(i -> {
        char c = s.charAt(i);
    });

-7

ट्रैवर्स के लिए एक स्ट्रिंग आप स्ट्रिंग के 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() जावा में स्ट्रिंग हैंडलिंग की विधि है जो विशिष्ट चरित्र के लिए स्ट्रिंग को ट्रैवर्स में मदद करती है।


2
क्या आप जानते हैं कि क्या for (char st: "xyz".toCharArray()) {}है?
अमितग

यह संकलन नहीं होगा।
मैरून

-1 ऑफ-टॉपिक (विषय: प्रत्येक के लिए), और चारैट के बजाय चारएट का उपयोग करें
पीनट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.