আমি স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য প্রতিটি লুপ কীভাবে প্রয়োগ করব?


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
@ পেসিয়ার নং, বর্তমান জাভা সংকলকরা কখনই কোডটি অনুকূলিত করবে না।
RAnders00

1
@ RAnders00 সুতরাং, এই ক্ষেত্রে toCharArray( )3 বার বলা হয়?
denvercoder9

1
এর স্ট্রিং দৈর্ঘ্যের 211900000সাথে সম্পূর্ণ for (char c : str.toCharArray()) { }হতে সময়টি 250 মিলিয়ন ডলার এবং সম্পূর্ণ হতে সময়টি for (char c : charArray) { }<10 মিমি । অবশ্যই, এই সময়ের মানগুলি হার্ডওয়্যারের উপর নির্ভর করবে তবে গ্রহণযোগ্যতাটি হ'ল একটি পদ্ধতি অন্যটির চেয়ে উল্লেখযোগ্যভাবে ব্যয়বহুল।
denvercoder9

7
@ রফিদুজ্জামানসনেট: না, toCharArray()লুপের দেহের ভিতরে নেই ; এটিকে কেবল একবার ডাকা হয় এবং তারপরে লুপটি ফলাফলের অ্যারেতে পুনরাবৃত্তি করে। (জন্য-প্রতিটি লুপ সাধারণ থেকে ভিন্ন for-loop, যা স্টপ শর্ত প্রতিটি পুনরাবৃত্তির মূল্যায়ন করে।)
না-Just-Yeti

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); }
স্কোমিসা

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 উল্লিখিত হিসাবে ফিরিয়ে দেয় :

এই ক্রম থেকে চার মানগুলি শূন্য-প্রসারিত করার একটি স্রোত প্রদান করে। যে কোনও চর যা কোনও সারোগেট কোড পয়েন্টে মানচিত্রগুলি ব্যাখ্যা ছাড়াই পাস করা হয়। স্রোতটি পড়ার সময় যদি ক্রমটি পরিবর্তিত হয় তবে ফলাফলটি সংজ্ঞায়িত হয়।

কেন ব্যবহার forEachOrderedএবং না forEach?

এর আচরণটি forEachসুস্পষ্টভাবে নিরপেক্ষবাদী যেখানে forEachOrderedস্ট্রিমটির প্রতিটি ক্রমের জন্য যখন এই স্ট্রিমের প্রতিটি উপাদানটির জন্য ক্রিয়া সম্পাদন করে, স্ট্রিমের এনকাউন্টার অর্ডে যদি স্ট্রিমের একটি সংজ্ঞায়িত ক্রম থাকে order সুতরাং forEachআদেশ রাখা হবে যে গ্যারান্টি দেয় না। আরও এই প্রশ্নটি দেখুন।

আমরা codePoints()মুদ্রণের জন্যও ব্যবহার করতে পারি, আরও তথ্যের জন্য এই উত্তরটি দেখুন।


এটি একাধিক অবজেক্ট তৈরি করে, সুতরাং এই উত্তরটি ক্যাভ্যাট ব্যতীত সম্পূর্ণ হয় না যে এটি সাধারণ সূচকযুক্ত লুপের চেয়ে কম দক্ষ হতে পারে।
টুলফোজার

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 ব্যবহার করে Eclipse সংগ্রহে , আপনি একটি ল্যাম্বদা বা পদ্ধতি রেফারেন্স সহ CharAdapterশ্রেণীর forEachপদ্ধতিটি a এর সমস্ত অক্ষরের উপরে পুনরাবৃত্তি করতে ব্যবহার করতে পারেন 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()) {}জানেন?
অমিতজি

এটি সংকলন করবে না।
মারউন

-১ অফ-টপিক (টপিক: প্রত্যেকের জন্য), এবং চ্যার্যাট এর পরিবর্তে চারএট ব্যবহার করুন
শিম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.