জাভাতে কোনও স্ট্রিংয়ের অক্ষরগুলির মাধ্যমে পুনরাবৃত্তি করার সবচেয়ে সহজ / সেরা / সবচেয়ে সঠিক উপায় কী?


340

StringTokenizer? রূপান্তর Stringএকটি থেকে char[]এবং বলছি যে ওভার? অন্যকিছু?




1
এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ৮৮৯৪২৪৮ / / বেঞ্চমার্কগুলি দেখায় স্ট্রিং.সিআরএট () ছোট স্ট্রিংয়ের জন্য দ্রুত এবং চার্ট অ্যারে পড়ার জন্য প্রতিবিম্বটি ব্যবহার করে বড় স্ট্রিংয়ের জন্য দ্রুততম।
জোনাথন


উত্তর:


362

আমি স্ট্রিংটির পুনরাবৃত্তি করতে লুপের জন্য ব্যবহার করি এবং charAt()প্রতিটি অক্ষর পরীক্ষা করার জন্য এটি ব্যবহার করি। যেহেতু স্ট্রিংটি একটি অ্যারের সাথে প্রয়োগ করা হয়, charAt()পদ্ধতিটি একটি ধ্রুবক সময় অপারেশন।

String s = "...stuff...";

for (int i = 0; i < s.length(); i++){
    char c = s.charAt(i);        
    //Process char
}

এটাই আমি করতাম। এটি আমার কাছে সবচেয়ে সহজ বলে মনে হচ্ছে।

যথার্থতা হিসাবে, আমি বিশ্বাস করি না যে এখানে আছে। এটি সব আপনার ব্যক্তিগত স্টাইলের উপর ভিত্তি করে।


3
সংকলক দৈর্ঘ্য () পদ্ধতির সাথে ইনলাইন করে?
উরি

7
এটি দৈর্ঘ্যটি ইনলাইন করতে পারে (), এটি কয়েকটি ফ্রেমের কল করার পিছনে যে পদ্ধতিটি উত্তোলন করে তা হ'ল তবে এটি করার জন্য এটি আরও দক্ষ (int i = 0, n = s.leight (); i <n; i ++) {চর c = s.charAt (i); }
ডেভ চেনি

32
একটি ক্ষুদ্র পারফরম্যান্স লাভের জন্য আপনার কোডকে গোলমাল করছে । আপনি কোডের এই ক্ষেত্রটি গতি-সমালোচনামূলক না হওয়া অবধি দয়া করে এড়িয়ে চলুন।
স্লিম

31
নোট করুন যে এই কৌশলটি আপনাকে কোড পয়েন্টগুলি নয়, অক্ষর দেয় , যার অর্থ আপনি সারোগেটস পেতে পারেন।
গাবে

2
@খ চার্টটি ও (1) নয় : এটি কীভাবে হয়? কোডটি String.charAt(int)নিছকই করছে value[index]। আমি মনে করি আপনি chatAt()অন্য কিছু নিয়ে বিভ্রান্ত করছেন যা আপনাকে কোড পয়েন্ট দেয়।
আনতাক

209

দুটি বিকল্প

for(int i = 0, n = s.length() ; i < n ; i++) { 
    char c = s.charAt(i); 
}

অথবা

for(char c : s.toCharArray()) {
    // process c
}

প্রথমটি সম্ভবত দ্রুত, তৃতীয়টি সম্ভবত আরও বেশি পঠনযোগ্য।


26
আরম্ভের এক্সপ্রেশনতে s.leth () স্থাপনের জন্য এক। যদি কেউ না জানে, কারণ এটি কেবলমাত্র একবারেই মূল্যায়ন করা হয় যেখানে এটি সমাপ্তির বিবৃতিতে i <sleleth () হিসাবে স্থাপন করা হয়েছিল, তবে প্রতিবার লুপ করা হলে sleleth () বলা হবে।
ডেনিস

57
আমি ভেবেছিলাম সংকলক অপ্টিমাইজেশন আপনার জন্য এটি যত্ন নিয়েছে।
ছড়া

4
@ মাথিয়াস আপনি জাভাপ শ্রেণীর বিচ্ছিন্নতা ব্যবহার করে দেখতে পারেন যে লুপ সমাপ্তির এক্সপ্রেশনটির জন্য s.leth () এর বারবার কলগুলি এড়ানো যায়। নোট করুন যে ওপিতে কোড পোস্ট করা হয়েছে s.leth () তে কলটি আরম্ভের অভিব্যক্তিটিতে রয়েছে, তাই ভাষা শব্দার্থতত্ত্ব ইতিমধ্যে গ্যারান্টি দেয় যে এটি কেবল একবার ডাকা হবে।
prasopes

3
@ প্রসোপগুলি নোট করুন যে বেশিরভাগ জাভা অপটিমাইজেশন ক্লাস ফাইলগুলিতে নয়, রানটাইমে ঘটে। এমনকি যদি আপনি দৈর্ঘ্যে বারবার কলগুলি দেখেছিলেন () যা কোনও রানটাইম পেনাল্টি নির্দেশ করে না, অগত্যা।
ইসহাক

2
@ লাস, স্থিতিযুক্ত কারণটি দক্ষতার জন্য - আপনার সংস্করণটি প্রতিটি পুনরাবৃত্তির উপর দৈর্ঘ্য () পদ্ধতিটি কল করে, অন্যদিকে ডেভ এটিকে একবার প্রারম্ভকালে বলে। এটি বলেছিল, সম্ভবত সম্ভবত জেআইটি ("ঠিক সময়ে") অপ্টিমাইজার অতিরিক্ত কলটিকে অপ্টিমাইজ করবে, সুতরাং এটি সম্ভবত কোনও লাভের জন্য পঠনযোগ্যতার পার্থক্য।
স্টিভ

90

আপনি বিএমপি (ইউনিকোড বেসিক বহুভাষিক প্লেন ) এর বাইরের অক্ষরগুলি , অর্থাৎ u0000-uFFF সীমার বাইরে যে কোড পয়েন্টগুলি ব্যবহার করছেন, এখানে বর্ণিত অন্যান্য কৌশলগুলির বেশিরভাগটি ভেঙে যায় । এটি কেবল বিরল ঘটবে, কারণ এর বাইরের কোড পয়েন্টগুলি বেশিরভাগ মৃত ভাষায় নির্ধারিত হয়। তবে এর বাইরে কিছু দরকারী চরিত্র রয়েছে, উদাহরণস্বরূপ কিছু গাণিতিক স্বরলিপি ব্যবহারের জন্য কোড পয়েন্ট, এবং কিছু চীনাতে সঠিক নামগুলি এনকোড করতে ব্যবহৃত হত।

সেক্ষেত্রে আপনার কোডটি হবে:

String str = "....";
int offset = 0, strLen = str.length();
while (offset < strLen) {
  int curChar = str.codePointAt(offset);
  offset += Character.charCount(curChar);
  // do something with curChar
}

Character.charCount(int)পদ্ধতি জাভা 5+ প্রয়োজন।

সূত্র: http://mindprod.com/jgloss/codepPoint.html


1
আপনি এখানে বেসিক বহুভাষিক প্লেন ব্যতীত অন্য কিছু কীভাবে ব্যবহার করবেন তা আমি পাই না। কার্চর এখনও 16 বিট দীর্ঘ?
অধ্যাপক ফ্যালকেন চুক্তিটি

2
আপনি হয় পুরো কোড পয়েন্ট সংরক্ষণ করার জন্য একটি int ব্যবহার করুন, নাহলে প্রতিটি গৃহস্থালি দুটি বিন্দুতে কোড পয়েন্টকে সংজ্ঞায়িত করে কেবল দুটি সার্গেট জুটির মধ্যে একটি সংরক্ষণ করবে।
স্ক।

1
আমি মনে করি কোড পয়েন্ট এবং সার্গেট জোড়গুলি পড়তে হবে। ধন্যবাদ!
অধ্যাপক ফ্যালকেন চুক্তি

6
+1 যেহেতু এটিই একমাত্র উত্তর বলে মনে হচ্ছে যে বিএমপির বাইরে ইউনিকোড অক্ষরের জন্য সঠিক
জেসন এস

কোডপয়েন্টগুলিতে পুনরাবৃত্তি করার ধারণাটি চিত্রের জন্য কিছু কোড লিখেছিলেন (চরগুলির বিপরীতে): gist.github.com/EmanuelOga/…
এমমানুয়েল ওগা

26

আমি সম্মত হই যে স্ট্রিংটোকেনাইজার এখানে ওভারকিল। আসলে আমি উপরের পরামর্শগুলি চেষ্টা করে সময় নিয়েছি took

আমার পরীক্ষাটি মোটামুটি সহজ ছিল: প্রায় দশ লক্ষ অক্ষর সহ একটি স্ট্রিংবিল্ডার তৈরি করুন, এটিকে একটি স্ট্রিংয়ে রূপান্তর করুন এবং তাদের প্রত্যেককে চরআউট () দিয়ে / ট্র্যাক করে চার্ট অ্যারেতে রূপান্তরিত করার পরে / একটি চরিত্রশিক্ষকের সাথে হাজার বার (অবশ্যই নিশ্চিত করে নিন স্ট্রিংয়ের উপর এমন কিছু করুন যাতে সংকলক পুরো লুপটিকে অপ্টিমাইজ করতে না পারে :-))।

আমার ২.6 গিগাহার্টজ পাওয়ার বইয়ের ফলাফল (এটি একটি ম্যাক :-)) এবং জেডিকে 1.5:

  • পরীক্ষা 1: চরআট + স্ট্রিং -> 3138 মি
  • পরীক্ষা 2: স্ট্রিং অ্যারে রূপান্তরিত -> 9568msec sec
  • পরীক্ষা 3: স্ট্রিংবিল্ডার চরআউট -> 3536 মি
  • পরীক্ষা 4: চরিত্রশিক্ষক এবং স্ট্রিং -> 12151msec

ফলাফলগুলি উল্লেখযোগ্যভাবে পৃথক হওয়ার কারণে, সবচেয়ে সোজা উপায়টিও দ্রুততম বলে মনে হয়। মজার বিষয় হল, স্ট্রিংবিল্ডারের চরআউট () স্ট্রিংয়ের চেয়ে কিছুটা ধীর গতির বলে মনে হচ্ছে।

বিটিডাব্লু আমি ক্যারেক্টারআইটার ব্যবহার না করার পরামর্শ দিই কারণ আমি 'F ইউএফএফএফএফ' চরিত্রের "পুনরাবৃত্তির সমাপ্তি" হিসাবে এর অপব্যবহারকে সত্যই এক ভয়ঙ্কর হ্যাক হিসাবে বিবেচনা করি। বড় প্রকল্পগুলিতে দু'জন ছেলেরা সবসময় দুটি ভিন্ন উদ্দেশ্যে একই ধরণের হ্যাক ব্যবহার করে এবং কোডটি সত্যই রহস্যজনকভাবে ক্র্যাশ করে।

পরীক্ষার মধ্যে একটি এখানে:

    int count = 1000;
    ...

    System.out.println("Test 1: charAt + String");
    long t = System.currentTimeMillis();
    int sum=0;
    for (int i=0; i<count; i++) {
        int len = str.length();
        for (int j=0; j<len; j++) {
            if (str.charAt(j) == 'b')
                sum = sum + 1;
        }
    }
    t = System.currentTimeMillis()-t;
    System.out.println("result: "+ sum + " after " + t + "msec");

1
এটি এখানে এখানে একই সমস্যাটির রূপরেখা দিয়েছে: স্ট্যাকওভারফ্লো.com
এমমানুয়েল ওগা

22

ইন জাভা 8 আমরা এটা যেমন সমাধান করতে পারে:

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

পদ্ধতি অক্ষর () ডকটিতেIntStream উল্লিখিত হিসাবে ফিরিয়ে দেয় :

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

পদ্ধতিটি ডক অনুসারে codePoints()একটি ফেরত দেয় IntStream:

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

চর এবং কোড পয়েন্ট কীভাবে আলাদা? এই নিবন্ধে উল্লিখিত হিসাবে :

ইউনিকোড ৩.১ পরিপূরক অক্ষর যুক্ত করেছে, মোট অক্ষরের সংখ্যা 216 টির চেয়ে বেশি হয়ে গেছে যা একক 16-বিট দ্বারা পৃথক করা যায় char। অতএব, charইউনিকোডের মৌলিক শব্দার্থ ইউনিটে একটি মানটির আর এক থেকে এক ম্যাপিং নেই। অক্ষরের মানগুলির বৃহত্তর সেটকে সমর্থন করার জন্য জেডিকে 5 আপডেট করা হয়েছিল। charপ্রকারের সংজ্ঞা পরিবর্তনের পরিবর্তে কয়েকটি নতুন পরিপূরক চরিত্র দুটি charমানের একটি সারোগেট জুড়ি দ্বারা প্রতিনিধিত্ব করে । নামকরণের বিভ্রান্তি হ্রাস করার জন্য, একটি কোড পয়েন্ট এমন পরিসংখ্যানের জন্য ব্যবহার করা হবে যা পরিপূরকগুলি সহ নির্দিষ্ট ইউনিকোড চরিত্রের প্রতিনিধিত্ব করে।

অবশেষে কেন forEachOrderedএবং না forEach?

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

একটি চরিত্রের মধ্যে পার্থক্যের জন্য , একটি কোড পয়েন্ট, একটি গ্লাইফ এবং একটি গ্রাফি এই প্রশ্নটি পরীক্ষা করে দেখুন ।


21

এর জন্য কিছু উত্সর্গীকৃত ক্লাস রয়েছে:

import java.text.*;

final CharacterIterator it = new StringCharacterIterator(s);
for(char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
   // process c
   ...
}

7
অপরিবর্তনীয় চর অ্যারের উপরে পুনরাবৃত্তি করার মতো সাধারণ কোনও কিছুর জন্য ওভারকিলের মতো মনে হচ্ছে।
ddimitrov

1
আমি কেন দেখছি না যে এটি অতিরিক্ত ওভারকিল করছে। ইটারেটর হ'ল যে কোনও কিছু করার জাভা-ইশ উপায় ... পুনরাবৃত্তিযোগ্য। স্ট্রিংচ্যাকারআইট্রেটর অপরিবর্তনীয়তার পুরো সুবিধা নিতে বাধ্য।
স্লিম

2
@Ddimitrov- এর সাথে সম্মত হন - এটি ওভারকিল। পুনরুক্তি ব্যবহারের একমাত্র কারণ হ'ল পূর্বাভাসের সুবিধা নেওয়া, যা লুপের চেয়ে "দেখার" পক্ষে কিছুটা সহজ। আপনি যদি যাইহোক লুপের জন্য একটি প্রচলিত লিখতে চলেছেন তবে চার্টটি () ব্যবহার করতে পারেন
রব গিলিয়াম

3
অক্ষরটি পুনরুক্ত করার জন্য কেবলমাত্র অক্ষরটি পুনরাবৃত্তি করার একমাত্র সঠিক উপায়, কারণ জাভা সরবরাহের চেয়ে ইউনিকোডের আরও বেশি জায়গা প্রয়োজন char। একটি জাভাতে char16 বিট রয়েছে এবং ইউনিকোড অক্ষরগুলি ইউ + এফএফএফএফ পর্যন্ত রাখতে পারে তবে ইউনিকোডে ইউ + 10 এফএফএফ পর্যন্ত অক্ষর নির্দিষ্ট করে। ইউনিকোড এনকোড করতে 16 বিট ব্যবহার করে একটি পরিবর্তনশীল দৈর্ঘ্যের অক্ষর এনকোডিংয়ের ফলাফল। এই পৃষ্ঠার বেশিরভাগ উত্তর ধরে ধরেছে যে জাভা এনকোডিং একটি ধ্রুবক দৈর্ঘ্যের এনকোডিং, যা ভুল।
সিলিং

3
@ অবধি এটি দেখে মনে হচ্ছে না যে কোনও চরিত্র পুনরাবৃত্তকারী আপনাকে নন-বিএমপি অক্ষরগুলি নিয়ে সহায়তা করবে: oracle.com/us/technologies/java/supplementary-142654.html
ব্রুনো ডি

18

আপনার ক্লাসপথে যদি পেয়ারা থাকে তবে নীচের একটি দুর্দান্ত পঠনযোগ্য বিকল্প। এমনকি এই মামলার জন্য পেয়ারা মোটামুটি বুদ্ধিমান কাস্টম তালিকার প্রয়োগও রয়েছে, সুতরাং এটি অকার্যকর হওয়া উচিত নয়।

for(char c : Lists.charactersOf(yourString)) {
    // Do whatever you want     
}

আপডেট: যেমন @ অ্যালেক্স উল্লেখ করেছেন, জাভা 8 এর CharSequence#charsসাথে ব্যবহারেরও রয়েছে। এমনকি টাইপটি ইন্টারস্ট্রিম হয়, তাই এটি অক্ষরের মতো ম্যাপ করা যায়:

yourString.chars()
        .mapToObj(c -> Character.valueOf((char) c))
        .forEach(c -> System.out.println(c)); // Or whatever you want

যদি আপনার কোনও জটিল করার দরকার হয় তবে লুপ + পেয়ারা নিয়ে যান কারণ আপনি ভেরিয়েবলগুলি (যেমন ইন্টিজারস এবং স্ট্রিংস) ফোরএচের অভ্যন্তরে ফোয়ারের আওতার বাইরে নির্ধারিত করতে পারবেন না। ফোয়ারের ভিতরে যা কিছু রয়েছে তা চেক করা ব্যতিক্রমও ছুঁড়ে ফেলতে পারে না, তাই এটি মাঝে মাঝে বিরক্তিকরও হয়।
সবুজপ

13

আপনার যদি কোনও String( কোডটির উত্তরগুলি দেখুন ) কোড পয়েন্টগুলির মাধ্যমে পুনরাবৃত্তি করতে হয় তবে CharSequence#codePointsজাভা 8 এ যুক্ত পদ্ধতিটি ব্যবহার করা একটি ছোট / আরও পঠনযোগ্য উপায় :

for(int c : string.codePoints().toArray()){
    ...
}

বা লুপের পরিবর্তে সরাসরি স্ট্রিমটি ব্যবহার করুন:

string.codePoints().forEach(c -> ...);

এছাড়াও রয়েছে CharSequence#charsযদি তোমরা (যদিও এটি একটি হল অক্ষরের একটি স্ট্রীম চান IntStream, কোন যেহেতু CharStream)।


3

StringTokenizerজেডিকে যে উত্তরাধিকার সূত্রে এটির একটি শ্রেণি ছিল তাই আমি ব্যবহার করব না ।

জাভাদোক বলেছেন:

StringTokenizerএটি একটি উত্তরাধিকার শ্রেণি যা সামঞ্জস্যতার কারণে ধরে রাখা হয় যদিও এর ব্যবহারটি নতুন কোডে নিরুৎসাহিত করা হয়েছে। এটি প্রস্তাবিত হয় যে এই কার্যকারিতা সন্ধানকারী যে কেউ তার পরিবর্তে বিভক্ত পদ্ধতি Stringবা java.util.regexপ্যাকেজটি ব্যবহার করুন।


টোকেনের উপর পুনরাবৃত্তি করার জন্য স্ট্রিং টোকেনাইজার পুরোপুরি বৈধ (এবং আরও দক্ষ) উপায় (অর্থাত্ একটি বাক্যে শব্দ) cha এটি চরিত্রগুলি পুনরুক্ত করার জন্য অবশ্যই একটি ওভারকিল। আমি আপনার মন্তব্যকে বিভ্রান্তিকর বলে আকাঙ্ক্ষা করছি।
ddimitrov

3
ডিডিমিট্রভ: আমি স্ট্রিংটোকেনাইজারকে জাভাডক ( java.sun.com/javase/6/docs/api/java/util/StringTokenizer.html ) থেকে একটি উদ্ধৃতি অন্তর্ভুক্ত করে কীভাবে নির্দেশ করে তা অনুসরণ করছি না বিভ্রান্তিকর। অফসেটে আপভোটড।
পাওয়ারলর্ড

1
ধন্যবাদ মিঃ বেমরোজ ... আমি এটি গ্রহণ করেছি যে উদ্ধৃত ব্লকের উদ্ধৃতিটি স্ফটিক স্বচ্ছ হওয়া উচিত ছিল, যেখানে সেক্ষেত্রে সক্রিয় বাগ ফিক্সগুলি স্ট্রিংটোকেনাইজারে করা হবে না বলে সম্ভবত ধারণা করা উচিত।
অ্যালান

2

আপনার যদি পারফরম্যান্সের প্রয়োজন হয় তবে অবশ্যই আপনার পরিবেশ পরীক্ষা করা উচিত । অন্য কোনো পথ নেই.

এখানে উদাহরণ কোড:

int tmp = 0;
String s = new String(new byte[64*1024]);
{
    long st = System.nanoTime();
    for(int i = 0, n = s.length(); i < n; i++) {
        tmp += s.charAt(i);
    }
    st = System.nanoTime() - st;
    System.out.println("1 " + st);
}

{
    long st = System.nanoTime();
    char[] ch = s.toCharArray();
    for(int i = 0, n = ch.length; i < n; i++) {
        tmp += ch[i];
    }
    st = System.nanoTime() - st;
    System.out.println("2 " + st);
}
{
    long st = System.nanoTime();
    for(char c : s.toCharArray()) {
        tmp += c;
    }
    st = System.nanoTime() - st;
    System.out.println("3 " + st);
}
System.out.println("" + tmp);

উপর জাভা অনলাইন আমি পাবেন:

1 10349420
2 526130
3 484200
0

অ্যান্ড্রয়েড x86 এপিআই 17 এ আমি পেয়েছি:

1 9122107
2 13486911
3 12700778
0

0

দেখুন জাভা টিউটোরিয়াল: স্ট্রিংস

public class StringDemo {
    public static void main(String[] args) {
        String palindrome = "Dot saw I was Tod";
        int len = palindrome.length();
        char[] tempCharArray = new char[len];
        char[] charArray = new char[len];

        // put original string in an array of chars
        for (int i = 0; i < len; i++) {
            tempCharArray[i] = palindrome.charAt(i);
        } 

        // reverse array of chars
        for (int j = 0; j < len; j++) {
            charArray[j] = tempCharArray[len - 1 - j];
        }

        String reversePalindrome =  new String(charArray);
        System.out.println(reversePalindrome);
    }
}

দৈর্ঘ্যের মধ্যে রাখুন int lenএবং forলুপ ব্যবহার করুন ।


1
আমি কিছুটা স্প্যামারিশ বোধ করতে শুরু করছি ... যদি এরকম শব্দ থাকে তবে :)। তবে এই সমাধানটিরও এখানে সমস্যাটির রূপরেখা দেওয়া হয়েছে: এখানে একই সমস্যাটি এখানে রূপরেখা দেওয়া হয়েছে: stackoverflow.com/questions/196830/…
এমমানুয়েল ওগা

0

স্ট্রিংটোকেনাইজার তার স্বতন্ত্র অক্ষরগুলিতে স্ট্রিং ভাঙার কাজটি সম্পূর্ণরূপে অসমর্থিত। আপনার সাথে String#split()সহজেই এমন কোনও রেজেক্স ব্যবহার করে তা করতে পারেন যা কোনও কিছুর সাথে মেলে না, যেমন:

String[] theChars = str.split("|");

তবে স্ট্রিংটোকেনাইজার রিজেক্সগুলি ব্যবহার করে না, এবং এমন কোনও ডিলিমিটার স্ট্রিং নেই যা আপনি নির্দিষ্ট করতে পারবেন যা অক্ষরের মধ্যে কোনও কিছুর সাথে মিলবে না। সেখানে হয় স্ট্রিং নিজেই ব্যবহার বিভেদক স্ট্রিং হিসেবে (ক বিভেদক এটা প্রতিটি চরিত্র উপার্জন) এবং আছে এটা বিভেদক আসতে: এক বুদ্ধিমান সামান্য আপনি একই জিনিস সম্পন্ন করার জন্য ব্যবহার করতে পারেন হ্যাক:

StringTokenizer st = new StringTokenizer(str, str, true);

তবে আমি কেবল এই অপশনগুলি তাদের বরখাস্ত করার উদ্দেশ্যে উল্লেখ করেছি mention উভয় কৌশলই মূল স্ট্রিংটিকে চর আদিমের পরিবর্তে এক-চরিত্রের স্ট্রিংগুলিতে ভেঙে দেয় এবং উভয়ই অবজেক্ট তৈরি এবং স্ট্রিং ম্যানিপুলেশন আকারে ওভারহেডের একটি বিরাট পরিমাণে জড়িত। লুপের জন্য চারএটি () কল করার সাথে এর তুলনা করুন, যা কার্যত কোনও ওভারহেডের জন্য আসে না।


0

এই উত্তর এবং এই উত্তরটি বিশদভাবে জানাচ্ছি ।

উপরের উত্তরগুলি এখানে অনেকগুলি সমাধানের সমস্যা এখানে নির্দেশ করে যা কোড পয়েন্ট মান দ্বারা পুনরাবৃত্তি করে না - তাদের কোনও সার্গেট অক্ষরের সাথে সমস্যা হবে । জাভা ডক্সও এখানে সমস্যাটির রূপরেখা দেয় (দেখুন "ইউনিকোডের চরিত্রের উপস্থাপনা")। যাইহোক, এখানে এমন কিছু কোড রয়েছে যা পরিপূরক ইউনিকোড সেট থেকে কিছু প্রকৃত সারোগেট অক্ষর ব্যবহার করে এবং সেগুলিকে আবার স্ট্রিংয়ে রূপান্তর করে । নোট করুন যে .toChars () অক্ষরের একটি অ্যারে প্রদান করে: আপনি যদি সার্গেটদের সাথে ডিল করছেন, আপনার অগত্যা দুটি চর থাকবে। এই কোডটি যে কোনও ইউনিকোড চরিত্রের জন্য কাজ করা উচিত ।

    String supplementary = "Some Supplementary: 𠜎𠜱𠝹𠱓";
    supplementary.codePoints().forEach(cp -> 
            System.out.print(new String(Character.toChars(cp))));

0

এই উদাহরণ কোড আপনাকে সাহায্য করবে!

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 20);
        System.out.println(map);

        Map sortedMap = sortByValue(map);
        System.out.println(sortedMap);
    }

    public static Map sortByValue(Map unsortedMap) {
        Map sortedMap = new TreeMap(new ValueComparator(unsortedMap));
        sortedMap.putAll(unsortedMap);
        return sortedMap;
    }

}

class ValueComparator implements Comparator {
    Map map;

    public ValueComparator(Map map) {
        this.map = map;
    }

    public int compare(Object keyA, Object keyB) {
        Comparable valueA = (Comparable) map.get(keyA);
        Comparable valueB = (Comparable) map.get(keyB);
        return valueB.compareTo(valueA);
    }
}

0

সুতরাং সাধারণত জাভাতে স্ট্রিংয়ের মাধ্যমে পুনরাবৃত্তি করার দুটি উপায় রয়েছে যা ইতিমধ্যে এই থ্রেডটিতে একাধিক ব্যক্তি উত্তর দিয়েছেন, কেবল আমার সংস্করণটি যুক্ত করে প্রথমে ব্যবহার করছেন

String s = sc.next() // assuming scanner class is defined above
for(int i=0; i<s.length; i++){
     s.charAt(i)   // This being the first way and is a constant time operation will hardly add any overhead
  }

char[] str = new char[10];
str = s.toCharArray() // this is another way of doing so and it takes O(n) amount of time for copying contents from your string class to character array

যদি পারফরম্যান্স ঝুঁকিতে থাকে তবে আমি প্রথমটিকে ধ্রুবক সময়ে ব্যবহার করার পরামর্শ দেব, যদি এটি না হয় তবে জাভাতে স্ট্রিং ক্লাসগুলির সাথে অপরিবর্তনীয়তা বিবেচনা করে দ্বিতীয়টি আপনার কাজটিকে আরও সহজ করে তোলে।

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