অক্ষর স্ট্রিংগুলির অ্যারেতে স্ট্রিং বিভক্ত করুন


112

আমার একটি স্ট্রিংকে একক অক্ষর স্ট্রিংয়ের অ্যারেতে বিভক্ত করতে হবে।

উদাহরণস্বরূপ, বিড়াল "বিড়াল" অ্যারে "সি", "এ", "টি" দেবে



3
একটি দ্রুত রেফারেন্স হিসাবে, "" বিড়াল "ফিরে পেতে" ".জায়েন ([" সি "," ক "," টি "]) দিন।
শুভা


জাভা 8: .split("")এটি করবে।
আমর লটফাই

উত্তর:


120
"cat".split("(?!^)")

এটি উত্পাদন করবে

অ্যারে ["সি", "এ", "টি"]


8
কীভাবে এবং কেন? এটি কোনও রেজেক্স মানে কোনও চরিত্র? কারণ মনে মনে, যেভাবে বিভাজন কাজ করে, এটি কেবল প্রকৃত অক্ষরগুলিতে (,?,!, ^, এবং) বিভক্ত হওয়া উচিত। যাইহোক, এটি আপনার কাজ হিসাবে এটি বলে কাজ করে।
Ty_

3
এটি প্রকৃতপক্ষে একটি রেজেক্স-এক্সপ্রেশন, একে নেগেটিভ লুক হেড বলে। ডকুমেন্টেশন এখানে চেকআউট করুন: docs.oracle.com/javase/6/docs/api/java/util/regex/…
এরউইন

4
@ ইডাব্লু-কোডমনকি (?!... )এটি একটি নেতিবাচক দৃser়তার জন্য রিজেক্স সিনট্যাক্স - এটি দৃser়ভাবে জানিয়েছে যে এর ভিতরে যা আছে তার কোনও মিল নেই। এবং ^স্ট্রিংয়ের শুরুর সাথে মিলে যায় তাই রেজেক্স প্রতিটি অবস্থানের সাথে মেলে যা স্ট্রিংয়ের শুরু নয় এবং সেখানে একটি বিভাজন সন্নিবেশ করায়। এই রেজেক্সটি স্ট্রিংয়ের শেষেও মেলে এবং ফলস্বরূপ একটি ফাঁকা স্ট্রিং যুক্ত করে, String.splitডকুমেন্টেশনটি বলে যে "ফাঁকা স্ট্রিংগুলি অনুসরণ করে ফলাফলের অ্যারেতে অন্তর্ভুক্ত করা হয়নি" except
বোয়ান

8
জাভা 8 আচরণ String.splitসামান্য এতটা পাল্টে দেয় যে নেতৃস্থানীয় খালি একটি শূন্য-চওড়া ম্যাচ এছাড়াও ফলাফলের অ্যারের মধ্যে অন্তর্ভুক্ত করা হয় না দ্বারা উত্পাদিত স্ট্রিং, তাই (?!^)কথন অবস্থান স্ট্রিংয়ের শুরু নয় যে হয়ে অপ্রয়োজনীয়, এর Regex যার ফলে কিছুই সরল করা - "cat".split("")- কিন্তু জাভা 7 এবং নীচে যা ফলাফল অ্যারে একটি নেতৃস্থানীয় খালি স্ট্রিং উত্পাদন করে।
বোয়ান

1
এটি একটি সম্পূর্ণ স্ট্রিংয়ের একটি অ্যারে তৈরি করে।
এডুয়ার্ড

109
"cat".toCharArray()

তবে আপনার যদি স্ট্রিং দরকার হয়

"cat".split("")

সম্পাদনা করুন: যা খালি প্রথম মানটি প্রদান করবে।


12
"বিড়াল" .স্প্লিট ("") ফিরে আসবে [, সি, এ, টি], না? আপনার অ্যারেতে আপনার একটি অতিরিক্ত চরিত্র থাকবে ...
রিফ করুন

4
"বিড়াল" .স্প্লিট ("") ম্যাট দ্বারা প্রত্যাশার মতো কাজ করে না, আপনি একটি অতিরিক্ত খালি স্ট্রিং <> [, সি, এ, টি] পাবেন।
রিফ 16

5
আপনি উত্তরটি জাভা ৮ ব্যবহার করে থাকলে এই উত্তরটি এখন কাজ করে st
অ্যালেক্সিস সি

4
এটি jdk8-এ একটি ভয়াবহ পরিবর্তন ছিল কারণ আমি বিভাজনের উপর নির্ভর করেছি ("") এবং এই নির্বোধ খালি প্রথম সূচকের কারণ হিসাবে কাজ করেছি। এখন জাভা 8 এ আপগ্রেড করার পরে, এটি কাজ করে যা আমি বহু বছর আগে এটি আশা করেছিলাম। দুর্ভাগ্যক্রমে এখন আমার কার্যবিধি আমার কোডটি ভেঙে দিয়েছে ... ggrrrr।
মার্চ

@ মার্ক আপনার সম্ভবত ব্যবহার করা উচিত .toCharArray(); এটি রেজেক্স এড়ায় এবং charআদিম একটি অ্যারে প্রদান করে যাতে এটি দ্রুত এবং হালকা হয়। এটি 1-বর্ণের স্ট্রিংগুলির একটি অ্যারের প্রয়োজন অদ্ভুত ।
বোয়ান

41
String str = "cat";
char[] cArray = str.toCharArray();

3
নিতপিকিং, মূল প্রশ্নটি স্ট্রিংয়ের অ্যারের জন্য জিজ্ঞাসা করে, চরের অ্যারে নয়। তবে এখান থেকে স্ট্রিংয়ের অ্যারে পাওয়া বেশ সহজ।
dsolimano

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

আপনি কীভাবে আবার রূপান্তর cArrayকরবেন String?
বিটম্যাপ

সঠিক বাক্য গঠন হবে: চর [] cArray = str.ToCharArray ();
dbz

6

যদি বেসিক বহুভাষিক সমতলের অক্ষরগুলি ইনপুট (কিছু সিজেকে অক্ষর, নতুন ইমোজি ...) প্রত্যাশিত হয় "a💫b".split("(?!^)")তবে ব্যবহার করা যায় না এমন পদ্ধতির ব্যবহার করা যায় না কারণ তারা এ জাতীয় অক্ষরগুলি ভেঙে ফেলে (ফলাফলগুলি array ["a", "?", "?", "b"]) এবং আরও নিরাপদ কিছু ব্যবহার করতে হবে:

"a💫b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

2

স্ট্রিংকে এক-চরিত্রের স্ট্রিংগুলির অ্যারে রূপান্তরিত করার একটি কার্যকর উপায় হ'ল:

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

যাইহোক, এই ঘটনা এই যে কোনো একাউন্ট লাগবে না charএকটি Stringআসলে একটি ইউনিকোড কোড দফা অর্ধেক প্রতিনিধিত্ব করতে পারে। (যদি কোড-পয়েন্ট বিএমপিতে না থাকে)) এটি মোকাবেলা করার জন্য আপনাকে কোড পয়েন্টগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে ... যা আরও জটিল।

এই পদ্ধতির ব্যবহারের চেয়ে দ্রুত হবে String.split(/* clever regex*/)এবং এটি সম্ভবত জাভা 8+ স্ট্রিম ব্যবহারের চেয়ে দ্রুত হবে। এটি এর থেকে দ্রুত সম্ভাব্য:

String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

কারণ toCharArrayরয়েছে কপি একটি নতুন অ্যারেতে অক্ষর।


2

অন্যান্য উত্তরগুলি সংক্ষিপ্ত করতে ...

এটি সমস্ত জাভা সংস্করণে কাজ করে:

"cat".split("(?!^)")

এটি কেবল জাভা 8 এবং তত উপরে কাজ করে:

"cat".split("")

0

সম্ভবত আপনি স্ট্রিং সামগ্রীর মধ্য দিয়ে যায় এমন একটি লুপ ব্যবহার করতে পারেন এবং charAtপদ্ধতিটি ব্যবহার করে অক্ষর দ্বারা অক্ষর আহরণ করতে পারেন ।

একটি সাথে মিলিত ArrayList<String>উদাহরণস্বরূপ, আপনার পৃথক অক্ষর আপনার অ্যারের পেতে পারেন।


হতে পারে আপনি এক পায়ে দাঁড়িয়ে "গড সেভ দ্য কুইন" গান করতে পারেন। দুঃখিত, তবে এটি সংশোধনের কাছাকাছিও নয়।
স্টিফেন সি

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
আপনি কি নিশ্চিত যে এটি একটি স্ট্রিংকে অ্যারেতে বিভক্ত করতে চলেছে? আপনি কেবল পর্দায় স্ট্রিংটি মুদ্রণ করছেন।
টিডিজি

0

যদি মূল স্ট্রিংটিতে পরিপূরক ইউনিকোড অক্ষর থাকে তবে split()এটি কাজ করবে না, কারণ এটি এই অক্ষরগুলিকে সারোগেট জোড়ায় বিভক্ত করে। এই বিশেষ অক্ষরগুলি সঠিকভাবে পরিচালনা করতে, এর মতো একটি কোড কাজ করে:

String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
    int cp = stringToSplit.codePointAt(i);
    char c[] = Character.toChars(cp);
    chars[j] = new String(c);
    i += Character.charCount(cp);
}

0

split("(?!^)")স্ট্রিংটিতে সারোগেট জোড়া থাকলে সঠিকভাবে কাজ করে না। আপনার ব্যবহার করা উচিত split("(?<=.)")

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

আউটপুট:

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