चरित्र तार की सरणी में भाजित स्ट्रिंग


113

मुझे स्ट्रिंग को एकल वर्ण स्ट्रिंग्स की एक सरणी में विभाजित करने की आवश्यकता है।

उदाहरण के लिए, "बिल्ली" को विभाजित करने से सरणी "c", "a", "t" होगी



3
एक त्वरित संदर्भ के रूप में, "बिल्ली" को वापस पाने के लिए ".join ([" c "," a "," t "])।
शुवा


जावा 8: कर .split("")देगा।
अमृत ​​लॉट

जवाबों:


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

इससे उत्पादन होगा

सरणी ["c", "a", "t"]


8
कैसे और क्यों? क्या यह रेगेक्स का अर्थ किसी भी चरित्र से है? क्योंकि मेरे दिमाग में, विभाजन के काम करने के तरीके के साथ, यह केवल वास्तविक वर्णों पर विभाजित होना चाहिए (, ;,; -;, ^, और)। हालाँकि, यह जैसा कहता है वैसा ही काम करता है।
Ty_

3
यह वास्तव में एक रेगेक्स-एक्सप्रेशन है, जिसे नकारात्मक लुकहेड कहा जाता है। यहाँ दस्तावेज़ देखें: docs.oracle.com/javase/6/docs/api/java/util/regex/…
Erwin

4
@ EW-CodeMonkey (?!... )एक नकारात्मक अभिकथन के लिए regex सिंटैक्स है - यह दावा करता है कि इसके अंदर क्या है, इसका कोई मेल नहीं है। और ^स्ट्रिंग की शुरुआत से मेल खाता है, इसलिए रेगेक्स हर स्थिति में मेल खाता है जो स्ट्रिंग की शुरुआत नहीं है, और वहां एक विभाजन सम्मिलित करता है। यह रेगेक्स स्ट्रिंग के अंत में भी मेल खाता है और इसलिए परिणाम के लिए एक रिक्त स्ट्रिंग भी जोड़ देगा, सिवाय इसके कि String.splitदस्तावेज़ीकरण कहता है कि "खाली स्ट्रिंग को अनुरेखण परिणामी सरणी में शामिल नहीं किया गया है"।
बोएन

8
जावा 8 में के व्यवहार String.splitसे थोड़ा तो बदल गया था कि प्रमुख खाली एक शून्य चौड़ाई मैच भी परिणाम सरणी में शामिल नहीं हैं द्वारा उत्पादित तार, इसलिए (?!^)दावे स्थिति स्ट्रिंग की शुरुआत नहीं है कि हो जाता है अनावश्यक, करने के लिए regex की इजाजत दी कुछ भी सरलीकृत न करें "cat".split("")- लेकिन जावा 7 और उससे नीचे के परिणाम सरणी में एक अग्रणी खाली स्ट्रिंग पैदा करता है।
Boann

1
यह एक पूरे स्ट्रिंग की एक सरणी बनाता है।
एडुआर्ड

109
"cat".toCharArray()

लेकिन अगर आपको स्ट्रिंग्स की आवश्यकता है

"cat".split("")

संपादित करें: जो पहले खाली मान लौटाएगा।


12
"बिल्ली" .plplit ("") वापस आ जाएगी [, c, a, t], नहीं? आपके ऐरे में एक अतिरिक्त चरित्र होगा ...
रीफ

4
"बिल्ली" .plplit ("") मैट द्वारा अपेक्षित के रूप में काम नहीं करता है, आपको एक अतिरिक्त खाली स्ट्रिंग => [, सी, ए, टी] मिलेगा।
रीफ

5
यदि आप जावा 8 का उपयोग कर रहे हैं तो यह उत्तर अब काम करता है। देखें stackoverflow.com/a/22718904/1587046
एलेक्सिस सी।

4
यह jdk8 में एक भयानक बदलाव था क्योंकि मैं विभाजन ("") पर निर्भर था और इस मूर्खतापूर्ण खाली पहले सूचकांक के कारण काम करता था। Java8 में अपग्रेड होने के बाद, यह काम करता है जैसा कि मैंने सालों पहले इसकी उम्मीद की थी। दुर्भाग्य से अब मेरा वर्कअर्ड मेरा कोड तोड़ देता है ... ggrrrr
मार्क

@Marc आपको शायद .toCharArray()वैसे भी उपयोग करना चाहिए ; यह regex से बचा जाता है और आदिमों की एक सरणी लौटाता है charताकि यह तेज़ और हल्का हो। 1-वर्ण स्ट्रिंग्स की एक सरणी की आवश्यकता है ।
Boann

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

3
Nitpicking, मूल प्रश्न स्ट्रिंग की एक सरणी के लिए पूछता है, चार की एक सरणी नहीं। हालांकि यहां से स्ट्रिंग की एक सरणी प्राप्त करना काफी आसान है।
dsolimano

हाँ, मुझे पहले से ही पता है कि वर्णों की एक सरणी कैसे प्राप्त करें। मैं सिर्फ चार सरणी के माध्यम से पुनरावृत्ति कर सकता हूं और यदि कोई अन्य तरीका नहीं है, तो प्रत्येक से एक स्ट्रिंग बनाएं।
मैट

आप cArrayवापस कैसे परिवर्तित करेंगे String?
बिटमैप

सही वाक्यविन्यास होगा: char [] cArray = str.ToCharArray ();
dbz

6

यदि मूल बहुभाषी विमान से परे वर्ण इनपुट पर अपेक्षित हैं (कुछ CJK वर्ण, नए इमोजी ...), जैसे कि "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, 🌹, 🌺, 🌷]

0

स्प्रेड ऑपरेटर [ ...] स्ट्रिंग में प्रत्येक चार के साथ एक सरणी बनाता है:

const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];

console.log(arrayized);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.