जावा स्ट्रिंग विभाजन ने खाली मान हटा दिए


286

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

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

मैं 8 मान प्राप्त करने की उम्मीद कर रहा हूं। [5,6,7, EMPTY, 8,9, EMPTY, EMPTY] लेकिन मुझे केवल 6 मान मिल रहे हैं।

किसी भी विचार और कैसे ठीक करने के लिए। EMPTY का कोई भी मूल्य कहीं भी नहीं आता है, यह एरे में होना चाहिए।

जवाबों:


492

split(delimiter)डिफ़ॉल्ट रूप से परिणाम सरणी से खाली स्ट्रिंग को निकालता है। इस तंत्र को बंद करने के हम की अतिभारित संस्करण का उपयोग करने की आवश्यकता split(delimiter, limit)के साथ limitकी तरह नकारात्मक मूल्य को सेट

String[] split = data.split("\\|", -1);

थोड़ा और विवरण:
split(regex)आंतरिक रूप से split(regex, 0)और इस पद्धति के दस्तावेज़ीकरण के परिणाम आप पा सकते हैं (मेरा जोर)

limitपैरामीटर बार पैटर्न लागू किया जाता है की संख्या को नियंत्रित करता है और इसलिए परिणामी सरणी की लंबाई को प्रभावित करता है।

सीमा तो nहै शून्य से अधिक तो पैटर्न सबसे n पर लागू किया जाएगा - 1 बार, सरणी की लंबाई n से अधिक नहीं होना होगा, और सरणी के अंतिम प्रविष्टि पिछले मिलान किया सीमांकक परे सभी इनपुट शामिल होंगे।

अगर nहै गैर सकारात्मक तो पैटर्न संभव के रूप में कई बार के रूप में लागू किया जाएगा और सरणी किसी भी लम्बाई हो सकता है।

अगर nहै शून्य तो पैटर्न संभव के रूप में कई बार के रूप में लागू किया जाएगा, सरणी किसी भी लम्बाई हो सकता है, और रिक्त स्ट्रिंग अनुगामी को छोड़ दिया जाएगा

अपवाद :

यह ध्यान देने योग्य है कि खाली स्ट्रिंग को हटाने से केवल तभी समझ में आता है जब इस तरह के खाली तंत्र को विभाजित तंत्र द्वारा बनाया गया हो । इसलिए "".split(anything)जब से हम ""दूर विभाजित नहीं कर सकते हम परिणाम [""]सरणी के रूप में मिल जाएगा ।
ऐसा इसलिए होता है क्योंकि विभाजन यहाँ नहीं हुआ था, इसलिए ""खाली होने और अनुगामी होने के बावजूद मूल स्ट्रिंग का प्रतिनिधित्व करता है, खाली स्ट्रिंग का नहीं जो विभाजन प्रक्रिया द्वारा बनाई गई थी ।


2
वाह। यह शानदार काम किया। लेकिन -1 यह सब कुछ कैसे बदलता है?
रेड्डी

1
तुम भी साथ की कोशिश कर सकते हैंdata.split("\\|", 8)
सुभ्रज्योति मजुमदार

23
उपयोग न करें split("\\|", 8)क्योंकि यह पहले आठ टोकन की सीमा है! यदि आपकी स्ट्रिंग परिवर्तनशील है, तो आपको इसका उपयोग करना चाहिए split("\\|", -1)ताकि यह असीमित संख्या में टोकन बनाए और अंत में खाली टोकन छोड़ें।
ADTC

2
@ रेडी -1 ( या वास्तव में कोई भी नकारात्मक संख्या, यह कोई फर्क नहीं पड़ता कि निरपेक्ष मूल्य क्या है ) अंत में खाली टोकन रखने के लिए विभाजन विधि बताता है। डिफ़ॉल्ट 0 है, जो सरणी के अंत में खाली टोकन को छोड़ने की विधि बताता है।
एडीटीसी

8
जाहिर है, बहुत से लोगों को उम्मीद थी कि अनुगामी खाली तारों को रखने के लिए डिफ़ॉल्ट कार्यक्षमता है split(regex)। वे यहाँ समाप्त हो गए और पता चला कि यह नहीं है।
अत्तिला तानी

32

के प्रलेखन से String.split(String regex):

यह विधि इस तरह से काम करती है जैसे कि दिए गए एक्सप्रेशन के साथ दो-तर्क विभाजन विधि और शून्य के एक सीमा तर्क को शामिल करके। अनुगामी खाली तार इसलिए परिणामी सरणी में शामिल नहीं हैं।

तो आपको String.split(String regex, int limit)नकारात्मक मान के साथ दो तर्क संस्करण का उपयोग करना होगा :

String[] split = data.split("\\|",-1);

डॉक्टर:

यदि सीमा n शून्य से अधिक है, तो पैटर्न को अधिकतम n - 1 बार लागू किया जाएगा, सरणी की लंबाई n से अधिक नहीं होगी, और सरणी की अंतिम प्रविष्टि में अंतिम मिलान किए गए सीमांकक से परे सभी इनपुट होंगे। यदि n गैर-सकारात्मक है, तो पैटर्न को यथासंभव कई बार लागू किया जाएगा और सरणी की कोई भी लंबाई हो सकती है। यदि n शून्य है, तो पैटर्न को यथासंभव कई बार लागू किया जाएगा, सरणी में कोई भी लंबाई हो सकती है, और खाली तारों को पीछे छोड़ दिया जाएगा।

यह किसी भी खाली तत्वों को नहीं छोड़ेगा, जिसमें अनुगामी शामिल हैं।


4

से String.split () API डॉक्टर :

इस स्ट्रिंग को दिए गए रेगुलर एक्सप्रेशन के मैचों के आसपास विभाजित करता है। यह विधि इस तरह से काम करती है जैसे कि दिए गए एक्सप्रेशन के साथ दो-तर्क विभाजन विधि और शून्य के एक सीमा तर्क को शामिल करके। अनुगामी खाली तार इसलिए परिणामी सरणी में शामिल नहीं हैं।

अतिभारित String.split (regex, int) आपके मामले के लिए अधिक उपयुक्त है।


1
यह व्यवहार की व्याख्या करता है लेकिन प्रश्न का उत्तर नहीं देता है।
assylias

@assylias ने इसे मेरे उत्तर में जोड़ा :) :)
PermGenError

4

String[] split = data.split("\\|",-1);

यह सभी समय में वास्तविक आवश्यकता नहीं है। ऊपर का दोष नीचे दिखाया गया है:

Scenerio 1:
When all data are present:
    String data = "5|6|7||8|9|10|";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 7
    System.out.println(splt.length); //output: 8

जब डेटा गायब है:

Scenerio 2: Data Missing
    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output: 8

वास्तविक आवश्यकता लंबाई है 7 होना चाहिए हालांकि डेटा गायब है। क्योंकि ऐसे मामले हैं जब मुझे डेटाबेस या कुछ और में सम्मिलित करने की आवश्यकता होती है। हम नीचे दृष्टिकोण का उपयोग करके इसे प्राप्त कर सकते हैं।

    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output:7

मैंने यहाँ क्या किया है, मैं निकाल रहा हूँ "|" अंत में पाइप और फिर स्ट्रिंग को विभाजित करना। यदि आपके पास "," एक सेपरेटर के रूप में है, तो आपको प्रतिस्थापन के अंदर ", $" को जोड़ना होगा।


1

आपके पास कई विभाजक हो सकते हैं, जिनमें व्हाट्सएप वर्ण, अल्पविराम, अर्धविराम आदि शामिल हैं, जिन्हें दोहराने योग्य समूह में [] +, जैसे:

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

आपके पास 4 टोकन होंगे - ए, बी, सी, डी

स्रोत स्ट्रिंग में अग्रणी विभाजकों को इस विभाजन को लागू करने से पहले निकालने की आवश्यकता होती है।

पूछे गए प्रश्न के उत्तर के रूप में:

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

यदि आपके पास विभाजक के रूप में आपके साथ है तो व्हाट्सएप केवल उसी स्थिति में जोड़ा जाएगा |

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