जावा संग्रह एपीआई के पास अंतिम विधि क्यों नहीं है? [बन्द है]


19

यह आदेश दिए गए संग्रह जैसे java.util.List के लिए है। भाषा डिजाइनरों ने अंतिम पद्धति को क्यों शामिल नहीं किया? केवल वे कारण जो मैं सोच सकता हूं:

  • संग्रह खाली होने पर अस्पष्टता (वापसी शून्य या फेंक अपवाद)
  • एपीआई ब्लोट

कोई और कारण?


9
+1 को उस सरासर संख्या के लिए जिसे मुझे लिखना है collection.get(collection.size() - 1)
jprete

1
अपनी खुद की उपयोगिता वर्ग क्यों न लिखें, जिसमें यह विधि है, और कोई अन्य विधि जिसे आप संग्रह के साथ उपयोग करना चाहते हैं?
महमूद होसाम

7
पहली () विधि भी नहीं है, इसलिए अंतिम () विधि क्यों होनी चाहिए?
पतरस टेलर

6
@Peter ने केवल getLast को लागू न करने से बदतर बात का आग्रह किया () इसे (-1) जैसी हैक के साथ लागू कर रहा है।
एल्ब

2
@ एएलबी मुझे लगता है कि "हैक" देखने वाले की नजर में है :) इस समय में, मैं अजगर के -1 वाक्य रचना की सराहना करता हूं। बेशक, अगर आप मुझसे भविष्य में या अतीत में कुछ समय के लिए फिर से पूछेंगे, तो मैं ठीक वैसा ही महसूस कर सकता हूं जैसा आप करते हैं।
तीन-कप

जवाबों:


13

एपीआई ब्लोट शायद इसका जवाब है। मेरे अनुभव से केवल मुझे इस कार्यक्षमता की आवश्यकता थी क्यू या स्टैक उपयुक्त विधि वाले कार्य के लिए सही डेटा संरचना थी।


लगता है कि आप आंशिक रूप से सही हैं, लेकिन अगर जावा ने get(-1)एक सूची के अंत से पुनर्प्राप्त करने का समर्थन किया , तो यह वही करेगा जो ओपी को बिना स्टैट जोड़े बिना करना चाहता था। इस तरह के अस्पष्ट उत्तर के रूप में मेरा जवाब है।
user949300

1
मुझे लगता है कि एक बड़ा जवाब यह है कि जावा की प्रारंभिक विफलता (.NET में दोहराई गई, और अभी भी उत्तरार्द्ध मामले में चल रही है) डिफ़ॉल्ट इंटरफ़ेस विधियों का समर्थन करने का मतलब है कि इंटरफेस होने में एक सदस्य शामिल है जो 99% कार्यान्वयन उसी तरह से संभाल लेंगे जो अतिरिक्त काम को लागू करेगा कुछ के लाभ के लिए सभी कार्यान्वयन पर जो उन्हें अलग तरीके से लागू करेगा।
सुपरकैट

16

एक last()विधि बस के रूप में आसान है list.get(list.size()-1), जैसे कोई first()विधि या fifth()विधि नहीं है। यह संश्लेषित करने के लिए कठिन नहीं है और एक विशेषज्ञता है। आप reverse()सूची भी list.get(0)दे सकते हैं और जो lastआइटम देगा। चीजें जो करना आसान है, आमतौर पर अपने स्वयं के विशेष तरीके नहीं मिलते हैं।

import java.util.ArrayList;
import java.util.List;

public class Main
{
    public static void main(String[] args)
    {
        final List<String> l = new ArrayList<String>();

        l.add("A");
        l.add("B");
        l.add("Z");

        System.out.println("l.get(0) = " + l.get(0));
        System.out.println("l.get(l.size()-1) = " + l.get(l.size() - 1));
    }
}

निम्नलिखित आउटपुट में परिणाम

l.get(0) = A
l.get(l.size()-1) = Z

यह मान लेना भी उचित है कि Listइंटरफ़ेस को लागू करने वाली हर चीज में वास्तव में last()किसी भी चीज की अवधारणा है ।


1
यह हालांकि दोनों मामलों में स्पष्ट होगा
एंटो

ध्यान दें कि यदि संग्रह अभी तक पूरी तरह से आबाद नहीं है तो आकार () विधि उत्तर देने में सक्षम नहीं हो सकती है।

1
.size()वर्तमान आकार को लौटाएगा .size()-1चाहे वह अंतिम तत्व ही क्यों न हो, यह कैसे पता चलेगा कि वह पूरी तरह से आबाद है या नहीं?

1
विनिर्देश द्वारा, एक सूची में Integer.MAX_VALUE तत्व से अधिक हो सकते हैं, जिसमें मामला आकार () रिटर्न Integer.MAX_VALUE है, इसलिए .size()-1इसे लागू करने का सही तरीका नहीं है last()(हालांकि इतनी बड़ी सूची की संभावना बहुत कम है और मुझे आश्चर्य है कि इस तरह की एक सूची है) लागू होगा toArray()...)
user281377

1
C # में a .irst और .Last विधि है। केवल अंतिम आइटम प्राप्त करने के लिए किसी सूची को उलट देना बिलकुल भी कारगर नहीं है।
Carra

5

java.util.LinkedListपरिभाषित करता है getLast()और getFirst()तरीकों। दुर्भाग्य से इन विधियों में से एक में यह परिभाषित नहीं है, इसलिए आपको लिंक्डलिस्ट प्रकार का उपयोग करना होगा। यदि आप केवल अंतिम तत्व में रुचि रखते हैं, तो आप java.util.Queueइंटरफ़ेस की peek()विधि का उपयोग करने पर विचार कर सकते हैं । लिंक्डलिस्ट लागू करता है कतार।


0

मूल रूप से आपको या तो size()एक- forलूप के लिए पूछना होगा या इसके पुनरावृत्त के लिए पूछकर इसे पुन: व्यवस्थित करना होगा और थोड़ी देर या डू-लूप में इसका उपयोग करना होगा। अपने उद्देश्य के लिए उपयुक्त एक का उपयोग करें।

यदि कोई अधिक प्रविष्टियाँ हैं, तो इट्रेटर किसी दिए गए बिंदु पर जानता है और अगर वहाँ है तो आपको अगले प्राप्त करने की अनुमति देता है। आप तब तक दोहराते हैं जब तक "अधिक प्रविष्टियाँ?" विफल रहता है।

Http://download.oracle.com/javase/tutorial/collections/interfaces/collection.html पर "ट्रैवर्सिंग कलेक्शन" अनुभाग देखें


यह सवाल का जवाब नहीं है। किसी सूची में अंतिम तत्व खोजने के लिए एक पुनरावृत्ति का उपयोग करना भी बेहद अक्षम है।
मछली पालन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.