2009-05-19 21 views
7

मुझे समझ में नहीं आ रहा है कि क्यों जावा की [String.substring() विधि] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring(int,%20int%29) इस तरह से निर्दिष्ट है। मैं इसे क्रमांकित स्थिति में शुरू करने और निर्दिष्ट वर्णों को वापस करने के लिए नहीं कह सकता; मुझे गणना करना है अंत स्थिति अपने आप को। और अगर मैं सिर्फ मेरे लिए स्ट्रिंग के बाकी लौटने का, स्ट्रिंग की समाप्ति के बाद समाप्त कर स्थिति निर्दिष्ट बजाय, जावा एक अपवाद फेंकता है।सबस्ट्रिंग() कैसे काम करना चाहिए?

जहां सबस्ट्रिंग मैं भाषाओं के लिए इस्तेमाल किया कर रहा हूँ() (या substr()) दो पैरामीटर लेता है: एक प्रारंभ स्थिति, और लंबाई। क्या यह जावा के तरीके से अपेक्षाकृत बेहतर है, और यदि हां, तो क्या आप इसे साबित कर सकते हैं? substring() के लिए सबसे अच्छी भाषा विनिर्देश क्या है देखा, और जब कभी भी भाषा को अलग-अलग करने के लिए एक अच्छा विचार होगा? क्या वह इंडेक्सऑटऑफबाउंड अपवाद है कि जावा एक अच्छा डिज़ाइन विचार फेंकता है, या नहीं? यह सब सिर्फ व्यक्तिगत वरीयता के लिए नीचे आ गया है?

+2

यह वास्तव में निजी प्राथमिकता है, जो है यह क्या करता है की बात है "विषयपरक और बहसशील"। मुझे अलग-अलग समय में सबस्ट्रिंग के "लंबाई" और "अंत स्थिति" दोनों स्वादों की आवश्यकता है, इसलिए मेरे लिए यह समझ में नहीं आता कि एक दूसरे की तुलना में "बेहतर" है। –

+2

इसके बारे में कोई तर्कसंगतता की आवश्यकता नहीं है क्योंकि यह व्यक्तिपरक है। शीश। क्या हम पवित्र युद्ध किए बिना भाषा के निर्णयों के सापेक्ष गुणों पर बात नहीं कर सकते? यदि जॉन स्कीट सोचता है कि यह जवाब देने योग्य है और तर्क के लिए सिर्फ एक कॉल नहीं है, निश्चित रूप से इसका मतलब कुछ है? – skiphoppy

+1

अगर मैं इसे "आश्चर्यचकित" और "असुविधा" शब्दों को निकालने के लिए संपादित करता हूं, तो क्या यह कम तर्कसंगत दिखाई देगा, क्योंकि किसी ने वास्तव में तर्क नहीं दिया है? भाषा डिजाइन प्रश्न हैं (जो ज्यादातर मामलों में स्वाभाविक रूप से कुछ व्यक्तिपरक व्यापारिक शामिल हैं) स्टैक ओवरफ़्लो के लिए उपयुक्त नहीं है? – skiphoppy

उत्तर

1

यदि आप leave off the 2nd parameter यह गणना करने के बिना आपके लिए स्ट्रिंग के अंत में जाएंगे।

+0

कभी-कभी आप x से 20 वर्ण बाद या स्ट्रिंग के अंत तक, जो भी छोटा हो, से चाहते हैं। – Yishai

+1

और कभी-कभी आप अंकों को छोड़कर, स्ट्रिंग के बाकी हिस्सों तक x से आधा चाहते हैं। कोई एपीआई सभी संभावित आवश्यकताओं को पूरा नहीं कर सकता है। –

+1

कोई एपीआई सभी संभावित आवश्यकताओं को पूरा नहीं कर सकता है, लेकिन मुझे लगता है कि कुछ एपीआई दूसरों की तुलना में अधिक आवश्यकताओं को पूरा कर सकते हैं। मैं अभी भी उस पर मुस्कुरा रहा हूं, और प्रतिक्रिया देख रहा हूं। :) उस अंतिम वाक्य के लिए – skiphoppy

3

दूसरा पैरामीटर वैकल्पिक होना चाहिए, पहले पैरामीटर ऋणात्मक मानों को स्वीकार करना चाहिए ..

5

मैं भाषाओं जहां सबस्ट्रिंग() (या substr()) दो पैरामीटर लेता करने के लिए इस्तेमाल कर रहा हूँ: एक शुरुआत की स्थिति, और लंबाई। जावा यह करने के तरीके के मुकाबले यह बेहतर है, और यदि ऐसा है, तो क्या आप इसे साबित कर सकते हैं?

नहीं, यह निष्पक्ष रूप से बेहतर नहीं है। यह सब उस संदर्भ पर निर्भर करता है जिसमें आप इसका उपयोग करना चाहते हैं। यदि आप एक विशिष्ट लंबाई के एक सबस्ट्रिंग को निकालना चाहते हैं, तो यह बुरा है, लेकिन यदि आप एक सबस्ट्रिंग निकालना चाहते हैं जो समाप्त होता है, तो कहें, "।" की पहली घटना स्ट्रिंग में, यदि आप पहली बार लंबाई की गणना करना चाहते हैं तो यह बेहतर है। सवाल यह है कि: कौन सी आवश्यकता अधिक आम है? मैं बाद वाला कहूंगा। बेशक, एपीआई में दोनों संस्करणों का सबसे अच्छा समाधान होगा, लेकिन यदि आपको एक स्थिर उपयोगिता विधि का उपयोग करके हर समय लंबाई-आधारित की आवश्यकता होती है तो वह भयानक नहीं है।

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

इसके अलावा, जावा के पास alternative substring() विधि है जो स्ट्रिंग के अंत तक प्रारंभ सूचकांक से सबस्ट्रिंग लौटाती है।

9

ऐसे समय होते हैं जब दूसरा पैरामीटर लंबाई अधिक सुविधाजनक होता है, और ऐसे समय होते हैं जब दूसरा पैरामीटर "ऑफसेट टू ऑफ स्टॉप" होना अधिक सुविधाजनक होता है। इसी प्रकार ऐसे समय होते हैं जब "यदि मैं आपको कुछ बड़ा देता हूं, तो बस स्ट्रिंग के अंत में जाएं" सुविधाजनक है, और ऐसे समय होते हैं जब यह एक बग इंगित करता है और वास्तव में अपवाद फेंकना चाहिए।

यदि आपके पास फ़ील्ड की निश्चित लंबाई है तो दूसरा पैरामीटर लंबाई उपयोगी है।उदाहरण के लिए:

// C# 
String guid = fullString.Substring(offset, 36); 

दूसरा पैरामीटर एक ऑफसेट किया जा रहा उपयोगी है अगर आप पर निर्भर जा रहे हैं एक और सीमांकित:

// Java 
int nextColon = fullString.indexOf(':', start); 
if (start == -1) 
{ 
    // Handle error 
} 
else 
{ 
    String value = fullString.substring(start, nextColon); 
} 

आमतौर पर, एक का उपयोग करना चाहते एक है कि के विपरीत है आपके वर्तमान प्लेटफार्म पर, मेरे अनुभव में प्रदान किया गया :)

+4

+1। :) – jmucchiello

+0

+1, इसी कारण से। –

+0

+1। इसी कारण से। –

1

कुछ प्रतिक्रिया प्राप्त करने के बाद, मुझे लगता है कि दूसरा पैरामीटर-जैसा-सूचक परिदृश्य उपयोगी है, लेकिन अब तक उन सभी परिदृश्यों में अन्य भाषा/एपीआई सीमाएं। उदाहरण के लिए, एपीआई इनपुट स्ट्रिंग में पहले कॉलन से पहले और बाद में स्ट्रिंग देने के लिए एक सुविधाजनक दिनचर्या प्रदान नहीं करता है, इसलिए इसके बजाय मुझे उस स्ट्रिंग की अनुक्रमणिका और कॉल सबस्ट्रिंग() मिलती है। (और यह बताता है कि substr() में दूसरा स्थान पैरामीटर वांछित इंडेक्स को 1, आईएमओ द्वारा ओवरहूट करता है।)

ऐसा लगता है कि भाषा के टूलकिट में स्ट्रिंग-प्रोसेसिंग फ़ंक्शंस के एक अधिक व्यापक सेट के साथ, दूसरा- पैरामीटर-ए-इंडेक्स परिदृश्य दूसरे-पैरामीटर-जैसी-लंबाई तक खो देता है। लेकिन किसी ने मुझे एक counterexample पोस्ट करें। :)

+0

"उदाहरण के लिए, एपीआई इनपुट स्ट्रिंग में पहले कॉलन से पहले और बाद में स्ट्रिंग देने के लिए एक सुविधाजनक दिनचर्या प्रदान नहीं करता है, इसलिए इसके बजाय मुझे उस स्ट्रिंग की अनुक्रमणिका और कॉल सबस्ट्रिंग() मिलती है।" - यदि आप एपीआई को सब कुछ करने के लिए चाहते थे, तो हमारे पास सीखने के लिए बड़ी एपीआई होगी और स्टैक ओवरफ्लो में जवाब होंगे कि क्यों कोई व्यक्ति इसे लिखने के बजाय 30 सेकंड खर्च करने के बजाय स्ट्रिंग ऑब्जेक्ट पर 30000 विधियों में से किसी एक का उपयोग नहीं करता है। यही कारण है कि हम प्रोग्रामर हैं, क्योंकि सबकुछ अभी तक लिखा नहीं गया है। यदि आपको कार्य एक्स बहुत करना है, तो इसे करने के लिए अपनी खुद की लाइब्रेरी लिखें। –

+0

क्यों दुनिया में सभी लोग अपनी लाइब्रेरी लिखना चाहते हैं, जब वे एक कार्यान्वयन कर सकते हैं सभी संलग्न फेंसपोस्ट त्रुटियों को डीबग करें? – skiphoppy

0

आप इस दूर की दुकान है, तो समस्या अपने सपनों नाक में दम कर बंद कर देना चाहिए और आप अंत में एक अच्छी रात के आराम को प्राप्त करेंगे:

public String skipsSubstring(String s, int index, int length) { 
    return s.subString(index, index+length); 
} 
+0

यह केवल इंडेक्सऑटऑफबाउंड अपवाद के साथ उड़ाएगा। :) मुझे substring() न्यूनतम (सूचकांक + लंबाई, एस। लम्बाई()) के लिए दूसरा पैरामीटर बनाने के लिए एक चेक जोड़ने की आवश्यकता होगी। – skiphoppy

+0

स्ट्रिंग के कार्यान्वयन को देखते हुए, ऐसा लगता है कि जावा के लिए दोनों प्रतिमान प्रदान करना बहुत मुश्किल नहीं होगा: substring() जारी है, और substr() अन्य भाषाओं में अर्थशास्त्र का अधिक आम हो सकता है। आंतरिक रूप से कार्यान्वयन ऐसा लगता है जैसे यह सीधा होगा। – skiphoppy

+1

मुझे लगता है कि अलग-अलग अर्थशास्त्र के साथ दोनों substring() और substr() दोनों के लिए यह भयानक होगा।मैं काफी गारंटी दे सकता हूं कि मैं आधा समय से गलत का उपयोग कर रहा हूं - और मुझे लगता है कि मेरे अधिकांश साथी प्रोग्रामर भी होंगे। –

संबंधित मुद्दे