2010-10-12 8 views
8

जब मैं जावा समस्याओं से संपर्क करता हूं, तो मैं संग्रह पैटर्न का उपयोग करता हूं। हालांकि, डेल्फी में ऐसा करना काफी दुःस्वप्न है क्योंकि चीजों को संभालने के लिए कोई इंटीजर ऑब्जेक्ट नहीं है।कौन सा डेल्फी डेटा संरचना अद्वितीय पूर्णांक की एक सूची रख सकती है?

मुझे डेटा संरचना की आवश्यकता है जिसमें संख्याएं हों। मैं संख्याओं को जोड़ने, संख्याओं को हटाने, और संग्रह की सामग्री की जांच करने में सक्षम होना चाहता हूं, और प्रत्येक संख्या अद्वितीय होना चाहिए।

मुझे ऐसे समाधान में रूचि नहीं है जिसे मुझे लागू करने और बग के लिए परीक्षण करने की आवश्यकता है। जावा की हैशटेबल जैसी कोई तैयार वस्तु है?

+6

डेल्फी का विच संस्करण आप उपयोग कर रहे हैं? – RRUZ

+2

यदि संख्या 0 और 255 के बीच हैं, तो "बाइट सेट" का उपयोग करें। –

उत्तर

6

मुझे पता है कि यह गंदा है, लेकिन आप TStringList (या THashedStringList) का दुरुपयोग कर सकते हैं।

var 
    numberList: TStringList; 
begin 
    numberList := TStringList.Create; 
    numberList.Duplicates := dupIgnore; 
    numberList.Sorted := true; 
    numberList.add(IntToStr(1)); 
    numberList.add(IntToStr(2)); 
    numberList.add(IntToStr(3)); 
    numberList.add(IntToStr(1)); 
    // numberList.CommaText = '1,2,3' 
+0

मैं इसे अन्य तारों के साथ गलती करने में सक्षम नहीं होना चाहता हूं। बाह, मुझे लगता है कि यह करेगा। खराब डेल्फी संपादित करें: हालांकि मुझे कम समय लगता है। धन्यवाद!!! – none

+4

@ नहीं, आपके कस्टम TIntegerList को लागू करने में केवल कुछ मिनट लग सकते हैं। – splash

+3

मैं सिर्फ टीस्ट्रिंगलिस्ट के बजाय एक टीएलिस्ट का उपयोग करता हूं, पॉइंटर को पूर्णांक कास्टिंग करता हूं। अगर मेरे पास हाल ही में डेल्फी संस्करण (> = 200 9) था तो शायद मैं एक टीएलिस्ट का उपयोग करूंगा। –

5

"मानक" वीसीएल पुस्तकालय में डेल्फी कंटेनर वर्ग खराब हैं। यह एक लंबे समय से स्थायी मुद्दा है जो केवल नवीनतम संस्करणों में आंशिक रूप से सही है। यदि आप डेल्फी> = 200 9 का उपयोग कर रहे हैं तो आपके पास जेनेरिक क्लास है जो आपके स्वयं के वर्ग को लिखने से पहले, एक गैर मानक तरीके से TList का उपयोग करने या किसी तृतीय पक्ष लाइब्रेरी का उपयोग करने से पहले पूर्णांक डेटा प्रकारों को संभाल सकता है। यदि आपको संख्याएं स्टोर करना है, यदि वे 32 बिट लंबे हैं तो आप उन्हें टीएलिस्ट में स्टोर कर सकते हैं, उन्हें पॉइंटर्स से और उन्हें कास्टिंग कर सकते हैं। विशिष्टता सुनिश्चित करने के लिए आपको Add() विधि को ओवरराइड करना होगा। आप टीबीआईटी का भी उपयोग कर सकते हैं और इसी "स्लॉट" को सही करने के लिए सेट कर सकते हैं। अन्यथा आपको उदाहरण के लिए JCL (फ्री) या DIContainers (वाणिज्यिक) जैसे तृतीय पक्ष पुस्तकालयों का उपयोग करने की आवश्यकता है।

+1

मुझे खेद है, लेकिन पॉइंटर्स को संख्या के रूप में डालने के लिए मेरे लिए "नहीं" है। अगर मैं दृढ़ता से भाषा के साथ काम करने की सुरक्षा छोड़ रहा हूं तो मैं लिस्प भी जा सकता हूं। अगर मैं गलती से इन नंबरों के साथ मेमोरी कॉल करता हूं, तो उस गड़बड़ी से वापस रास्ता बहुत लंबा है कि मैं इसे कल्पना भी नहीं करना चाहता हूं। – none

+2

आप उस सूची के सूचक के साथ मेमोरी कॉल करेंगे जिसके बारे में आप कुछ भी नहीं जानते? ऐसा लगता है कि आपको केवल एक दृढ़ता से टाइप की गई भाषा की तुलना में अधिक आवश्यकता है ... वह उसी सूची में पॉइंटर्स और पूर्णांक मिश्रण करने के बारे में बात नहीं कर रहा है (यह बुरा होगा)। –

+1

सच है, हालांकि यदि आप काफी थके हुए हैं तो आप लोगों को आश्चर्यचकित होंगे कि लोग आपके जीवन को एक या दो दिन के लिए नरक छोड़ने के लिए तैयार हैं, बस बेकार है कि उन्हें पर्याप्त नींद नहीं मिली है। "यह दवाओं से पहले आपका दिमाग है, यह आपके दिमाग कीड़े के बाद है। क्या आप इसे आजमा सकते हैं?" या इसे कहने के बेहतर तरीके से "कोड को अपना कोड दें जैसे एक धारावाहिक हत्यारा आपके कोड की समीक्षा करेगा, और वह जानता है कि आप कहां रहते हैं।" – none

20
uses GpLists; 

var 
    numberList: TGpIntegerList; 
begin 
    numberList := TGpIntegerList.Create; 
    numberList.Duplicates := dupIgnore; 
    numberList.Sorted := true; 
    numberList.add(1); 
    numberList.add(2); 
    numberList.add(3); 
    numberList.add(1); 

GpLists बीएसडी लाइसेंस के साथ आता है। इसमें 64-बिट पूर्णांक वाले वर्ग भी शामिल हैं - TGpInt64List - और अन्य सामानों का समूह।

+1

अच्छा काम! इसे लागू करने में कितने मिनट लगते हैं? ;-) – splash

+0

जीपीएल के लिए धन्यवाद, बीमार देखो। – none

1

व्यक्तिगत रूप से, मैं दृढ़ता से डेटा भंडारण के लिये DeCAL का उपयोग शुरू सलाह देते हैं। यह DMap कंटेनर जो लगभग किसी भी डेटा प्रकार, आत्म अनुकूलित है संभाल कर सकते हैं क्योंकि यह आंतरिक लाल काला पेड़ का उपयोग करता है और यह आप डुप्लिकेट जोड़ने के लिए (यदि आप डुप्लिकेट डालने की आवश्यकता है, तो आप DMultiMap उपयोग कर सकते हैं) अनुमति नहीं दी जाएगी है। DMap के साथ एक और बड़ी बात यह है कि सूची में तत्व ढूंढना बहुत तेज़ है (TStringList से बहुत तेज़)। डेकेल के साथ काम करना अन्य डेल्फी पुस्तकालयों की तुलना में थोड़ा अलग है, लेकिन एक बार जब आप इसके साथ सहज महसूस करते हैं, तो आप अपने कोड में किसी भी स्ट्रिंगलिस्ट का उपयोग नहीं करेंगे।

संपादित करें: डीकल के पुराने संस्करण SourceForge पर है, लेकिन यहाँ आप महान पीडीएफ मैनुअल पा सकते हैं।

1

डेल्फी इकाई mxarrays (निर्णय घन), वहाँ एक वर्ग TIntArray है सेट यह dupIgnore को संपत्ति डुप्लिकेट है है। यह मूल्यों को भी क्रमबद्ध कर सकता है। यदि आप इसका उपयोग करेंगे, तो इस इकाई में बग को सही करने के लिए Quality Central Report #:2703 देखें।

7

Dictionary<Integer,Boolean> या इसी तरह करना होगा।

+0

शब्दकोश एक डेल्फी 7 featuer या ऊपर है? – none

+0

डेल्फी 7 से ऊपर; डेल्फी 2007 मुझे लगता है। –

4

आप पूर्णांक के सेट को स्टोर करने के लिए एक TList का उपयोग कर सकते हैं। यह पॉइंटर्स को स्टोर करना है, लेकिन चूंकि पॉइंटर्स केवल पूर्णांक हैं, यह इंटीग्रर्स को संग्रहीत करते समय पूरी तरह से काम करता है।

3

यह जेनरिक साथ डेल्फी संस्करण के लिए एक सरल उपाय है:

TUniqueList<T> = class(TList<T>) 
public 
    function Add(const Value: T): Integer; 
end; 

{ TUniqueList<T> } 

function TUniqueList<T>.Add(const Value: T): Integer; 
begin 
    if not Contains(Value) then 
    Result := inherited Add(Value); 
end; 

और अगर पूर्णांकों के बहुत सारे के साथ प्रदर्शन के लिए महत्वपूर्ण है तो आप सूची हल कर रखने के लिए और बाइनरी serch

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