) के रूप में इस तरह के निर्माणों का उपयोग करने की आवश्यकता होती है, कम बार "ट्रिनर" ऑब्जेक्ट्स ( Triple...">

जावा और उनके संग्रह में वस्तुओं के टप्ल्स

अक्सर अभ्यास में "जोड़ी" ( Pair<First, Second> ) के रूप में इस तरह के निर्माणों का उपयोग करने की आवश्यकता होती है, कम बार "ट्रिनर" ऑब्जेक्ट्स ( Triplet<First, Second, Third> ) और संबंधित वस्तुओं की लंबी श्रृंखला। इस संबंध में, मैं हमेशा सोच रहा था कि JDK में ( java.lang.* या java.util.* ) अभी भी कोई मानक Pair<First, Second> या लंबा निर्माण क्यों नहीं है। मुझे लगता है कि कई जावा प्रोग्रामर का अपना "जोड़ी" कार्यान्वयन है। मैं कोई अपवाद नहीं हूं।

और एक बार फिर बड़ी संख्या में अलग-अलग tuples के साथ काम करने की आवश्यकता पर ठोकर खाई, मैंने इस समस्या से व्यवस्थित रूप से निपटने का फैसला किया। वह परियोजना के लिए एक नाम के साथ आया, लक्ष्य निर्धारित किया और कुछ समय लेने वाले प्रयोगों के बाद, कोड (git: //github.com/telesik/rumba.git) पोस्ट किया।

मैं क्या हासिल करना चाहता था:

टपल की रोशनी की घटना


और यहाँ Cortege इंटरफ़ेस Cortege :
 public interface Cortege<V, T extends Cortege> { T setValue(V value); T nextElement(); <Vi> Vi getValue(int index) throws ClassCastException; // be careful with types. Type is not bounded int getDeep(); <Vi> void setValue(int index, Vi value); // be careful with types. Type is not bounded Cortege<V, T> setValues(Object... values); // be careful with types. Type is not bounded!!! V getValue(); static abstract class End<V, T extends Cortege<V, T>> implements Cortege<V, T> { } } 

नीचे दिया गया आंकड़ा स्पष्ट रूप से मनमानी लंबाई और तत्व प्रकारों के ट्यूपल्स का वर्णन करने के लिए तंत्र को दर्शाता है
छवि
अंजीर। 1. मनमानी लंबाई और तत्वों के प्रकार के tuples का वर्णन करने के लिए तंत्र

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

उपयोग के उदाहरण


मैं तुरंत उपयोग के उदाहरण के लिए पास करूंगा:

 //   : Cortege<Long, Cortege<String, Cortege.End>> cortegeLS = CortegeChain.create(2); 

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

नोट: लेकिन फिर भी, अगर कोई अपने समाधान की पेशकश कर सकता है, तो यह पैरामीटर के साथ एक समस्या है - मैं बहुत आभारी रहूंगा।

तो एक उदाहरण है
 //    // 1-  (    ,   ) cortegeLS.setValue(4L); cortegeLS.nextElement().setValue("str"); // 2-  (  ,   ) cortegeLS.setValue(4L).setValue("str"); // 3-  ( ,   ) cortegeLS.setValues(4L, "str"); 

अब पढ़ रहे हैं
 // 1-  (    ,   ) Long valueA = cortegeLS.getValue(); // 2-  (    ,   ) String valueB = cortegeLS.nextElement().getValue(); // 3-  (    ,   ) Long valueC = cortegeLS.getValue(1); String valueD = cortegeLS.getValue(2); 

टपल के साथ और क्या किया जा सकता है:
1. "सही" पर टुपल प्राप्त करें।
 Cortege<String, Cortege.End> rightCortegeS = cortegeLS.nextElement(); //   Cortege.End rightCortegeEnd = cortegeLS.nextElement().nextElement(); 

2. "गहराई" (टपल में तत्वों की संख्या) प्राप्त करें
 int deep = cortegeLS.getDeep(); 

शायद बस इतना ही। लेकिन सभी नहीं! :)

टपल कलेक्शन


मैंने एक कारण के लिए एक ट्यूपल बनाया। अब, इस तरह के निर्माण के बाद, यह एक अनुकूल संग्रह परिवार ( java.util.Collection ) के लिए "टाई" करना अच्छा होगा। जल्दी से नहीं कहा। लेकिन संग्रह के एक तत्व के रूप में एक टुपल का केले का उपयोग दिलचस्प नहीं है। मैं न केवल संग्रह के तत्वों को ढूंढना, हटाना, संशोधित करना चाहता हूं, जो कि java.util.Set और java.util.List इंटरफेस के पारंपरिक कार्यान्वयन देते हैं, लेकिन संग्रह में संग्रहीत ट्यूपल्स के अलग-अलग तत्वों को खोजने, संपूर्ण स्तंभों को संशोधित करने आदि के लिए फ़िल्टर भी करते हैं। जो संबंधपरक तालिकाओं के लिए स्वाभाविक है।

इसलिए फिर से लक्ष्य निर्धारित करें:

नोट: सभी जो मैं चाहता था, केवल अंतिम आइटम "दृश्य" (रिलेशनल डेटाबेस में देखने का एनालॉग) को लागू करना संभव नहीं था। लेकिन काम चल रहा है और शायद निकट भविष्य में इस होनहार विचार की प्राप्ति दुनिया में आ जाएगी।

और यहाँ क्या हुआ:
 public interface CortegeCollection<T extends Cortege> extends Collection<T>, Iterable<T> { <T> boolean contains(int num, T obj); CortegeCollection<T> extract(int num, Object key); CortegeCollection<T> extract(Corteges.Predicate<T> predicate); // <C> CortegeCollection<T> view(int num, Corteges.Predicate<C> predicate); T findAny(int num, Object key); T findAny(Corteges.Predicate<T> predicate); <Vi> List<Vi> getColumnCopy(int num); <Vi> void fill(int num, Vi value); } public interface CortegeSet<T extends Cortege> extends CortegeCollection<T>, Set<T> { } public interface CortegeList<T extends Cortege> extends CortegeCollection<T>, List<T> { } 


छवि
अंजीर। 2. टपल संग्रह की टोपोलॉजी

टपल संग्रह का उपयोग करने के उदाहरण


अब यह संभवतः सार्थक है, जैसा कि Cortege विवरण के मामले में Cortege तुरंत उपयोग के दृश्य उदाहरणों पर जाएं:
 public class ExampleCollections { public static void main(String[] args) { //   CortegeHashSet CortegeSet<Cortege<Long, Cortege<String, Cortege.End>>> cortegeHashSetLS = Corteges.newCortegeHashSet(2); for (long i = 0; i < 5; i++) { Cortege<Long, Cortege<String, Cortege.End>> cortegeLS = CortegeChain.create(2); cortegeLS.setValue(i).setValue("" + i); cortegeHashSetLS.add(cortegeLS); } for (Cortege cortege : cortegeHashSetLS) { System.out.println(cortege); } cortegeHashSetLS.add(CortegeChain.<Long, Cortege<String, Cortege.End>>create(2)); Cortege<Long, Cortege<String, Cortege.End>> cortegeIS = CortegeChain.create(2); System.out.println(cortegeHashSetLS.contains(cortegeIS)); cortegeIS.setValue(null).setValue("3"); System.out.println(cortegeIS); System.out.println(cortegeHashSetLS.contains(cortegeIS)); System.out.println(cortegeHashSetLS.contains(1, 3L)); Cortege<Long, Cortege<Long, Cortege<String, Cortege.End>>> cortegeLLS1 = CortegeChain.create(3); Cortege<Long, Cortege<Long, Cortege<String, Cortege.End>>> cortegeLLS2 = CortegeChain.create(3); Cortege<Long, Cortege<Long, Cortege<String, Cortege.End>>> cortegeLLS3 = CortegeChain.create(3); CortegeChain<String, CortegeChain<Long, CortegeChain<String, Cortege.End>>> cortegeSLS = CortegeChain.create(3); cortegeLLS1.setValue(1L); cortegeLLS1.nextElement().setValue(11L); cortegeLLS1.nextElement().nextElement().setValue("AAA"); cortegeLLS2.setValue(2L); cortegeLLS2.nextElement().nextElement().setValue("BBB"); cortegeLLS3.setValue(3L); cortegeLLS3.nextElement().setValue(33L); cortegeLLS3.nextElement().nextElement().setValue("AAA"); CortegeHashSet<Cortege<Long, Cortege<Long, Cortege<String, Cortege.End>>>> cortegeSetLLS = Corteges.newCortegeHashSet(cortegeLLS1.getDeep()); System.out.println(cortegeSetLLS.contains(cortegeLLS1)); cortegeSetLLS.add(cortegeLLS1); cortegeSetLLS.add(cortegeLLS2); cortegeSetLLS.add(cortegeLLS3); System.out.println(cortegeSetLLS.contains(cortegeLLS1)); for (Cortege<Long, Cortege<Long, Cortege<String, Cortege.End>>> cortege : cortegeSetLLS) { System.out.println(cortege); } System.out.println(cortegeSetLLS.contains(3, "AAA")); cortegeSetLLS.fill(1, 5L); cortegeSetLLS.fill(2, 8L); cortegeSetLLS.fill(3, "XXX"); for (Cortege<Long, Cortege<Long, Cortege<String, Cortege.End>>> cortege : cortegeSetLLS) { System.out.println(cortege); } // Collection<Cortege> corteges = cortegeSetLLS.extract(2, "111"); } } 


संक्षेप में कहना


जैसा कि आप उदाहरण से देख सकते हैं, हमें वस्तुओं के लंबे ट्यूल को संग्रहीत करने और हेरफेर करने के लिए एक काफी सुविधाजनक पुस्तकालय मिला। पुस्तकालय लाभ में शामिल हैं:

Cortege संरचना के अलावा, पुस्तकालय में दो प्रकार के संग्रह हैं जो जाने-माने java.util.Set और java.util.List ) com.rumba.cortege.CortegeSet और com.rumba.cortege.CortegeList ) को com.rumba.cortege.CortegeList

लेकिन जावा में जेनेरिक घोषणाओं के लिए "प्राप्त" करने में असमर्थता के कारण मुख्य रूप से स्पष्ट कमियां हैं और, परिणामस्वरूप, सूचकांक द्वारा टपल तत्व तक पहुंचने पर प्रकार नियंत्रण का नुकसान। निष्पक्षता में, मैंने ऐसे पुस्तकालयों की तलाश की जो समान समस्याओं को हल करते हैं, और उन्हें जवेटुपल्स के बजाय एक दिलचस्प कार्यान्वयन मिला । इसमें, संबंधित वस्तुओं की "लंबी" श्रृंखलाओं को घोषित करने की समस्या को डेवलपर्स के संदर्भ में "उचित" टपल की एक सरल गणना द्वारा हल किया जाता है।


निष्कर्ष


लाइब्रेरी में काम करते समय, मैंने सबसे विशिष्ट, और मेरे दृष्टिकोण से, उपयोगी कार्यों को कवर करने की कोशिश की, जो ट्यूपल्स और उनके संग्रह के साथ काम करते समय उत्पन्न होते हैं। दुर्भाग्य से, सभी योजनाओं को लागू नहीं किया गया है, लेकिन मुझे उम्मीद है कि जो काम पूरा हो गया है उसका कुछ अंश किसी के लिए उपयोगी होगा। लेकिन काम जारी है, मुझे उम्मीद है कि व्यर्थ नहीं।
इस लेख और पुस्तकालय के लिए एक रचनात्मक फिटबैक प्राप्त करना बहुत दिलचस्प होगा।

उपयोगी लिंक


javatuples
लागू करने का काफी दिलचस्प प्रयास

Source: https://habr.com/ru/post/In144176/


All Articles