2011-06-14 22 views
13

तरह जावा एपीआई तरीकों में:सूचकांक से क्यों समावेशी है लेकिन अंत सूचकांक अनन्य है?

  • String.substring(int beginIndex, int endIndex)
  • String.subSequence(int beginIndex, int endIndex)
  • List.subList(int fromIndex, int toIndex)

क्यों शुरुआत सूचकांक समावेशी लेकिन अंत सूचकांक अनन्य है? उन्हें दोनों समावेशी क्यों डिजाइन नहीं किया जाना चाहिए?

उत्तर

16

क्योंकि:

  • जावा सी पर आधारित है, और सी यह इस तरह से करता है
  • यह कोड स्वच्छ बनाता है: यदि आप वस्तु के समाप्त करने के लिए कब्जा करने के लिए चाहते हैं, object.length (हालांकि वस्तु लागू पारित इस, जैसे आकार() आदि) toIndex पैरामीटर में - जोड़ने की आवश्यकता नहीं/घटाना 1

उदाहरण के लिए:

String lastThree = str.substring(str.length() - 3, str.length()); 

इस तरह, यह बहुत स्पष्ट है कि कोड में क्या हो रहा है (एक अच्छी बात)। वे दोनों की लंबाई हैं

char *strncat(char *dest, const char *src, size_t n); 

size_t पैरामीटर का मान है कि में जावा endPosition पैरामीटर से मेल खाती है:

संपादित एक सी समारोह है कि इस तरह बर्ताव करता है का एक उदाहरण strncatstring.h से है ऑब्जेक्ट, लेकिन 0 सेइंडेक्स हैं, तो 0 से ऑब्जेक्ट के अंत से एक बाइट होगा।

+2

+1 दूसरे कारण –

+1

के लिए किया जाता है जो सी फ़ंक्शन इस तरह से करता है? –

+0

यह सच नहीं है कि सी/सी ++ में सबस्ट्रेट जावा के रूप में काम करता है। सी में सबस्ट्रेट दूसरे पैरामीटर के रूप में एक लंबाई लेता है, इसलिए सबस्ट्रेट (3,2) का अर्थ है "सूचकांक 3 के साथ चार से शुरू होने वाले 2 अक्षर लें"। मुझे लगता है कि सी वाक्यविन्यास अधिक पठनीय है। – fresko

-1

इसके अलावा करने के लिए क्या बोहेमियन कहा:

यदि यह अनन्य थे, एक स्ट्रिंग में पहली 4 वर्ण प्राप्त करने के लिए, आप होगा करने के लिए:

String firstFour = String.substring(0, 3);

यही नहीं बल्कि बदसूरत है।

+1

क्या ओपी का मतलब 'substring (0,3)' नहीं है? –

+0

मैंने आपकी (-1, 4) त्रुटि को सुधारने की स्वतंत्रता ली - यह (0, 3) होगा। चीयर्स – Bohemian

+9

यह उत्तर संपादन के बाद समझ में नहीं आता है। – Suragch

0

समस्या यह है कि उन्होंने सी/सी ++ वाक्यविन्यास का उपयोग नहीं किया। मुझे लगता है कि सी वाक्यविन्यास अधिक पठनीय है। उदाहरण यदि आप एक सूची एक्स 3 तत्व से शुरू लंबाई 2 के साथ सबस्ट्रिंग लेना चाहते हैं, आप लिखते हैं

X.subList(2,3). 

जावा में, आप केवल एक सूची एक्स 3 तत्व के साथ एक sublist लेने के लिए चाहते हैं, आपको X.subList (2,3) लिखना होगा। यह वास्तव में बदसूरत है, ऐसा लगता है कि आप 2 तत्वों का एक उपन्यास ले रहे हैं। दूसरी ओर, X.subList (2,2) एक खाली सूची है - काफी उलझन में।

int startIndex = calculateStartIndex(); 
int endIndex = calculateEndIndex(); 
X.subList(startIndex, endIndex); 

असल में, अगर (startIndex == endIndex) → खाली सूची।

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

रिक्त सूची रखने के लिए, जब तक कि आप एक संयोजन का उपयोग न करें (उदाहरण: नकारात्मक या निचले अंत इंडेक्स रिक्त सूची के मामले में) - लेकिन ऐसी व्यवस्था कोडिंग में त्रुटियों को छुपा सकती है (दूसरा पैरामीटर कोई अंतर नहीं है -1 या -100!):

int startIndex = calculateStartIndex(); // return 0 
int endIndex = calculateEndIndex();  // return 0 
X.subList(startIndex, endIndex);  // this would return the 1st element of the list; how to get an empty list? Convenction needed! 
             // use a negative number to get empty list? And what if endIndex is negative because of a bug? 

मैं यह मामला, सी जीतता है; किसी भी मामले में अधिक पठनीय, यह एक दयालुता है कि उन्होंने इसे बदल दिया। लेकिन यह सिर्फ एक अतिरिक्त टिप्पणी है जिसे आप जोड़ सकते हैं।

0

यह पर्वतमाला [i, j> (या अन्य गणित अंकन [i, j) में की डिज्कस्ट्रा सम्मेलन कहा जाता है। इस तरह आप पर्वतमाला [a, b>, [b, c>, [c, d] के साथ सौदा कर सकते हैं।

यह तर्क दिया गया था कि यह कुछ हद तक अधिक कुशल है, और वास्तव में हम प्रोग्रामर में इसका इस्तेमाल करते हैं:

for (int i = 0; i < n; ++i) { ... } 

ऐसे पर्वतमाला तत्वों की संख्या j - i है, तो हाँ एक -1/+ 1 सहेजा जाता है

इसका उपयोग BitSet.set(from, to)

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