अद्यतन: यह उत्तर मूल प्रश्न के उत्तर में है, क्या जावा एसई 8 में जोड़े या ट्यूपल हैं? (और स्पष्ट रूप से, यदि नहीं, तो क्यों नहीं?) ओपी ने प्रश्न को और अधिक पूर्ण उदाहरण के साथ अपडेट किया है, लेकिन ऐसा लगता है कि इसे किसी भी तरह की पेयर संरचना का उपयोग किए बिना हल किया जा सकता है। [ओपी से नोट: यहाँ अन्य सही उत्तर है ।]
संक्षिप्त जवाब नहीं है। आपको या तो अपना स्वयं का रोल करना होगा या इसे लागू करने वाले कई पुस्तकालयों में से एक में लाना होगा।
Pair
जावा एसई में एक वर्ग होने का प्रस्ताव किया गया था और कम से कम एक बार खारिज कर दिया गया था। OpenJDK मेलिंग सूचियों में से एक पर इस चर्चा सूत्र को देखें । ट्रेडऑफ स्पष्ट नहीं हैं। एक तरफ, अन्य पुस्तकालयों और आवेदन कोड में कई जोड़ी कार्यान्वयन हैं। यह एक आवश्यकता को प्रदर्शित करता है, और जावा एसई के लिए इस तरह के एक वर्ग को जोड़ने से पुन: उपयोग और साझाकरण में वृद्धि होगी। दूसरी ओर, एक पेयर क्लास होने से आवश्यक प्रकार और सार बनाने के बिना जोड़े और संग्रह से जटिल डेटा संरचनाओं को बनाने के प्रलोभन में जोड़ा जाता है। (यह उस धागे से केविन बॉरिलिन के संदेश का एक उदाहरण है ।)
मैं हर किसी को उस पूरे ईमेल धागे को पढ़ने की सलाह देता हूं। यह उल्लेखनीय रूप से आनंददायक है और इसमें कोई दम नहीं है। यह काफी ठोस है। जब यह शुरू हुआ तो मैंने सोचा, "हाँ, जावा एसई में एक पेयर क्लास होना चाहिए" लेकिन जब तक धागा अपने अंत तक पहुँचता तब तक मैंने अपना विचार बदल दिया था।
ध्यान दें कि JavaFX में javafx.util.Pair क्लास है। जावाएफएक्स के एपीआई जावा एसई एपीआई से अलग से विकसित हुए हैं।
जैसा कि एक जुड़े हुए प्रश्न से देख सकते हैं कि जावा में C ++ जोड़ी के बराबर क्या है? वहाँ काफी बड़ा डिज़ाइन स्पेस है जो कि स्पष्ट रूप से इतना आसान एपीआई है। क्या वस्तुओं को अपरिवर्तनीय होना चाहिए? क्या उन्हें धारावाहिक होना चाहिए? क्या उन्हें तुलनीय होना चाहिए? क्लास फाइनल होनी चाहिए या नहीं? क्या दो तत्वों का आदेश दिया जाना चाहिए? क्या यह एक इंटरफ़ेस या एक वर्ग होना चाहिए? जोड़े पर क्यों रोक? क्यों नहीं ट्रिपल, क्वाड्स या एन-ट्यूपल्स?
और निश्चित रूप से तत्वों के लिए अनिवार्य नामकरण है:
- (ए, बी)
- (प्रथम क्षण)
- (बाएँ दांए)
- (कार, सीडीआर)
- (फू, बार)
- आदि।
एक बड़ा मुद्दा जिसका उल्लेख शायद ही किया गया है, वह है प्राइमेन्स से पेयर का संबंध। यदि आपके पास एक (int x, int y)
डीटम है जो 2 डी अंतरिक्ष में एक बिंदु का प्रतिनिधित्व करता है, तो इसका प्रतिनिधित्व करते हुए दो 32-बिट शब्दों के बजाय तीन वस्तुओं काPair<Integer, Integer>
उपभोग करता है । इसके अलावा, इन वस्तुओं को ढेर पर रहना चाहिए और जीसी ओवरहेड को उकसाना होगा।
यह स्पष्ट प्रतीत होगा कि, धाराओं की तरह, वहाँ के लिए आवश्यक होगा कि जोड़े के लिए आदिम विशेषज्ञता हो। क्या हम देखना चाहते हैं:
Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair
यहां तक कि एक IntIntPair
को अभी भी ढेर पर एक वस्तु की आवश्यकता होगी।
ये निश्चित रूप से, java.util.function
जावा एसई 8. में पैकेज में कार्यात्मक इंटरफेस के प्रसार की याद दिलाते हैं । यदि आप एक फूला हुआ एपीआई नहीं चाहते हैं, तो आप किन लोगों को छोड़ देंगे? आप यह भी तर्क दे सकते हैं कि यह पर्याप्त नहीं है, और कहा कि विशेषज्ञता के लिए Boolean
भी कहा जाना चाहिए।
मेरी भावना यह है कि यदि जावा ने बहुत पहले एक जोड़ी क्लास जोड़ी थी, तो यह सरल, या यहां तक कि सरलीकृत होता था, और यह उन उपयोग के कई मामलों को संतुष्ट नहीं करता था जिन्हें हम अभी कल्पना कर रहे हैं। विचार करें कि अगर PD को JDK 1.0 समय सीमा में जोड़ा गया होता, तो शायद यह परिवर्तनशील होता! (Java.util.Date को देखें।) क्या लोग इससे खुश होंगे? मेरा अनुमान है कि यदि जावा में एक पेयर क्लास था, तो यह थोड़े-थोड़े समय के लिए उपयोगी होगा और हर कोई अभी भी अपनी जरूरतों को पूरा करने के लिए अपना खुद का रोल कर रहा होगा, बाहरी पुस्तकालयों में विभिन्न पेयर और टपल कार्यान्वयन होंगे। और लोग अभी भी जावा के जोड़ी वर्ग को ठीक करने के बारे में बहस / चर्चा कर रहे हैं। दूसरे शब्दों में, आज हम जिस स्थान पर हैं, उसी तरह के हैं।
इस बीच, मूल मुद्दे को संबोधित करने के लिए कुछ काम चल रहे हैं, जो मूल्य प्रकारों के लिए जेवीएम (और अंततः जावा भाषा) में बेहतर समर्थन है । इस स्थिति को दस्तावेज़ देखें। यह प्रारंभिक, सट्टा कार्य है, और यह जेवीएम के दृष्टिकोण से केवल मुद्दों को शामिल करता है, लेकिन इसमें पहले से ही उचित मात्रा में विचार है। बेशक कोई गारंटी नहीं है कि यह जावा 9 में मिलेगा, या कभी भी कहीं भी मिलेगा, लेकिन यह इस विषय पर सोचने की वर्तमान दिशा को दर्शाता है।
AbstractMap.SimpleImmutableEntry<K,V>
वैसे भी, साल के लिए ... लेकिन मानचित्रण के बजायi
करने के लिए(i, value[i])
बस से छानने के लिएvalue[i]
और मानचित्रण वापस करने के लिएi
: क्यों नहीं बस फिल्टर द्वाराvalue[i]
मानचित्रण के बिना, पहली जगह में?