"Abcd" क्यों करता है ।StartsWith ("") सही है?


87

शीर्षक संपूर्ण प्रश्न है। क्या कोई मुझे कारण दे सकता है कि ऐसा क्यों होता है?

जवाबों:


164

हां - क्योंकि यह खाली स्ट्रिंग से शुरू होता है। वास्तव में, खाली स्ट्रिंग तार्किक रूप से हर जोड़ी वर्णों के बीच होती है।

इसे इस तरह से रखें: क्या "की परिभाषा" से शुरू होती है, क्या आप इसे दे सकते हैं? यहाँ "के साथ शुरू होता है" की एक सरल परिभाषा है:

"यदि पहले के साथ एक्स शुरू होता है y.Length अक्षर y से मेल खाते हैं।"

एक वैकल्पिक (समतुल्य) परिभाषा:

"x की शुरुआत y से होती है अगर x.Substring(0, y.Length).Equals(y)"


3
x की शुरुआत y से होती है यदि x.Substring (0, y.Length) .Equals (y) यदि और केवल यदि y .ength> 0
Vinko Vrsalovic

8
हाँ, आप वास्तव में इस मामले को स्पष्ट रूप से बाहर कर सकते हैं। यह एक बहुत अशुभ परिभाषा है, है ना?
जॉन स्कीट

7
सच। यह भी उन्हें गैर-अशक्त होने की आवश्यकता है, ... लेकिन मैं इन दोनों को सरल परिभाषा की भावना से दूर ले जाते हुए सटीकता के साथ जोड़ना चाहूंगा :)
जॉन स्कीट

8
प्रत्येक जोड़े के पात्रों के बीच खाली स्ट्रिंग की अनंत घटनाएँ होती हैं।
लोटस नोट्स

3
हाँ, यह एक नंबर से पहले एक शून्य डालने जैसा है - यह अभी भी मौजूद नहीं है, फिर भी मूल्य नहीं बदलता है।
pop850

47

जॉन स्कीट ने जो कहा, उस पर मैं विस्तार से बताने की कोशिश करूंगा।

मान लीजिए कि x, y और z स्ट्रिंग्स हैं और + ऑपरेटर वास्तव में संघनन है, तब:

अगर हम z को z = x + y लिखने के लिए विभाजित कर सकते हैं तो इसका मतलब है कि z x से शुरू होता है। क्योंकि प्रत्येक स्ट्रिंग z को z = "" + z में विभाजित किया जा सकता है, यह इस प्रकार है कि प्रत्येक स्ट्रिंग "" से शुरू होता है।

तो, क्योंकि ("" + "abcd") == "abcd" यह इस प्रकार है कि "abcd" की शुरुआत "" से होती है


17

यह विधि मान पैरामीटर की तुलना इस स्ट्रिंग की शुरुआत में मान के समान लंबाई पर करती है, और एक मान लौटाती है जो इंगित करता है कि क्या वे समान हैं। बराबर होने के लिए, मान एक खाली स्ट्रिंग (खाली) होना चाहिए, इसी उदाहरण का संदर्भ या इस उदाहरण की शुरुआत से मेल खाना चाहिए।

.NET स्ट्रिंग

यह सच है कि यदि तर्क द्वारा दर्शाया गया वर्ण अनुक्रम इस तार द्वारा दर्शाए गए वर्ण अनुक्रम का उपसर्ग है; गलत है अन्यथा। यह भी ध्यान रखें कि यदि तर्क एक खाली स्ट्रिंग है या इस स्ट्रिंग ऑब्जेक्ट के बराबर है, तो बराबर (ऑब्जेक्ट) विधि द्वारा निर्धारित होने पर सही लौटाया जाएगा

Java String.startsWith


17

मैं एक संबंधित तथ्य के साथ शुरुआत करूंगा जिसे समझना आसान है।

खाली सेट हर सेट का एक सबसेट है।

क्यों? सबसेट की परिभाषा में कहा गया है कि अगर हर तत्व एक तत्व है , तो एक सबसेट है । इसके विपरीत, का एक उपसमूह नहीं है अगर वहाँ का एक तत्व है का एक तत्व नहीं है ।ABABABAB

अब एक सेट ठीक करें B। मैं स्थापित करूँगा कि खाली सेट एक सबसेट है B। मैं यह करके दिखाऊंगा कि ऐसा नहीं है कि खाली सेट का सबसेट नहीं है B। यदि खाली सेट एक उपसमूह नहीं था, Bतो मैं उस खाली सेट का एक तत्व खोज सकता हूं जो अंदर नहीं है B। लेकिन खाली सेट में कोई तत्व नहीं होता है और इस तरह मैं एक ऐसा तत्व नहीं खोज सकता जो अंदर नहीं है B। इसलिए, यह मामला नहीं है कि खाली सेट का सबसेट नहीं है B। इस प्रकार, खाली सेट का सबसेट होना चाहिए B

कोई भी स्ट्रिंग खाली स्ट्रिंग से शुरू होती है।

सबसे पहले, हमें अपनी शुरुआत की परिभाषा पर सहमत होना चाहिए । चलो sऔर tहो stringरों हम कहते हैं कि s के साथ शुरू होता t है, तो s.Length >= t.Lengthऔर पहले t.Lengthके पात्रों tमैच के उन s। यही है, s.Length >= t.Lengthऔर Int32 indexऐसे हर एक के लिए 0 <= index < t.Length, s[index] == t[index]सच है। इसके विपरीत, हम कहेंगे कि यदि कथन से sप्रारंभ नहीं होता हैt

s.Length < t.Lengthया s.Length >= t.Lengthवहाँ Int32 indexऐसा है कि 0 <= index < t.Lengthऔरs[index] != t[index]

सच हैं। सादे अंग्रेजी में, sकी तुलना में कम है t, या, यदि नहीं, तो tचरित्र को उसी स्थिति में मिलान नहीं करने में एक चरित्र है s

अब एक तार को ठीक करें s। मैं स्थापित करूँगा sजो खाली स्ट्रिंग से शुरू होता है। मैं यह करके दिखाऊंगा कि यह ऐसा मामला sनहीं है जो खाली स्ट्रिंग से शुरू नहीं होता है। यदि sखाली स्ट्रिंग के साथ शुरू नहीं होता है तो s.Length < String.Empty.Lengthया s.Length >= String.Empty.Lengthऐसा Int32 indexही होता है 0 <= index < String.Empty.Length। लेकिन s.Length >= 0और String.Empty.Lengthशून्य के बराबर है इसलिए s.Length < String.Empty.Lengthसच होना असंभव है। इसी तरह, चूंकि `` स्ट्रिंग.ईमपेट.लिमिटेड is equal to zero, there is noInt32 इंडेक्स satisfying0 <= इंडेक्स <स्ट्रींग.इंप्टी।लिफ्टिंग`। इसलिये

s.Length < String.Empty.Lengthया s.Length >= String.Empty.Lengthऐसा कोई Int32 indexहै0 <= index < String.Empty.Length

गलत है। इसलिए, यह ऐसा मामला sनहीं है जो खाली स्ट्रिंग से शुरू नहीं होता है। इस प्रकार, sखाली स्ट्रिंग से शुरू करना चाहिए।

निम्नलिखित को एक विस्तार के रूप में कोडित के साथ शुरू का कार्यान्वयन है string

public static bool DoStartsWith(this string s, string t) {
    if (s.Length >= t.Length) {
        for (int index = 0; index < t.Length; index++) {
            if (s[index] != t[index]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

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


13

चलो बस "abcd".StartsWith("")झूठ ही कहते हैं ।

यदि ऐसा है तो निम्नलिखित अभिव्यक्ति क्या है, जो सही या गलत है:

 ("abcd".Substring(0,0) == "")

यह पता चलता है कि यह सच हो गया है, इसलिए स्ट्रिंग खाली स्ट्रिंग;; या दूसरे शब्दों में कहें तो "abcd" का विकल्प है जो 0 की स्थिति में शुरू होता है और 0 की लंबाई खाली स्ट्रिंग के बराबर होती है। सुंदर तार्किक imo।


तथ्य यह है कि "abcd"। Substring (0, 0) एक खाली स्ट्रिंग लौटाता है इसका मतलब यह नहीं है कि "abcd" वास्तव में एक खाली स्ट्रिंग से शुरू होता है। परिणाम के रूप में अच्छी तरह से 'अपरिभाषित' घोषित nullकिया गया है , के रूप में एक समान रूप से उचित वापसी मूल्य होगा।
टॉम लिंट

@TomLint नंबर। आप आमतौर पर IE x.FirstName.StartsWith (userEnteredFirstName) && x.LastName.StartsWith (userEnteredLastName) की शर्तों को जोड़ते हैं .... यह शर्त काम करता है भले ही दर्ज किए गए valeus में से एक खाली स्ट्रिंग है।
पॉप कैटालिन

7

C # में यह है कि विनिर्देश इसे प्रतिक्रिया के लिए कैसे कहता है;

बराबर होने के लिए, मान एक खाली स्ट्रिंग (खाली) होना चाहिए, इसी उदाहरण का संदर्भ या इस उदाहरण की शुरुआत से मेल खाना चाहिए।


5

दो तारों के पहले N अक्षर समान हैं। N दूसरी स्ट्रिंग की लंबाई यानी शून्य है।


5

"Abcd" क्यों करता है ।StartsWith ("") सही है?

वास्तविक उत्तर:

यह उस तरह से होना चाहिए अन्यथा आपके पास जहां मामला होगा

    "".startsWith("") == false 
    "".equals("") == true

    but yet

    "a".startsWith("a") == true
    "a".equals("a") == true

और फिर हमारे पास Y2K फिर से होगा क्योंकि सभी बैंक सॉफ़्टवेयर जो समान स्ट्रिंग्स पर निर्भर करते हैं, जो स्वयं से शुरू होते हैं, हमारे खातों को मिला देंगे और अचानक बिल गेट्स के पास मेरा धन होगा और मुझे उनका, और लानत है! भाग्य सिर्फ मेरे लिए ऐसा नहीं है।


मैं असहमत हूं। "" .startsWith ("") बराबर होना चाहिए, क्योंकि तार समान हैं, और कुछ अजीब व्यापारिक तर्क के कारण नहीं।
टॉम लिंट

@TomLint आप वास्तव में उत्तर में मुखरता से सहमत हैं ...
neonblitzer

4

केवल रिकॉर्ड के लिए, String.StartsWith()आंतरिक रूप से उस विधि को कहते हैं System.Globalization.CultureInfo.IsPrefix()जो निम्नलिखित चेक को स्पष्ट रूप से बनाती है:

if (prefix.Length == 0)
{
    return true;
}

1

क्योंकि एक स्ट्रिंग "कुछ भी नहीं" के साथ अच्छी तरह से शुरू होती है।


1
... कि अगर string.empty कुछ भी नहीं है! इस अति-सरलीकरण को सामान्यीकृत नहीं किया जा सकता है। मेरा सुझाव है कि हम अधिक सेट सिद्धांत-उन्मुख चर्चा का पालन करें।
पितो।

1

यदि आप इसे नियमित अभिव्यक्ति के संदर्भ में सोचते हैं, तो यह समझ में आता है। हर स्ट्रिंग (सिर्फ "abcd", भी "" और "sdf \ nff"), 'खाली स्ट्रिंग के साथ शुरू होता है' की नियमित अभिव्यक्ति का मूल्यांकन करते समय सच हो जाता है।

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