(मैं जानता हूँ कि यह एक साल बाद है, लेकिन अभी भी उपयोगी सामग्री।)
पैड पूर्णांक मूल्यों को Skamradt के सुझाव मान लिया गया है कि आप एक स्ट्रिंग की तुलना का उपयोग कर सॉर्ट करने के लिए जा रहे हैं। यह धीमा होगा। प्रत्येक डालने के लिए कॉलिंग प्रारूप(), धीमा अभी भी। इसके बजाय, आप एक पूर्णांक तुलना करना चाहते हैं।
आप एक रिकॉर्ड प्रकार से शुरू करें:
TExample = record
SortOrder : integer;
SomethingElse : string;
end;
आप राज्य नहीं था कैसे रिकॉर्ड संग्रहीत किया गया है, या आप उन्हें कैसे उपयोग करने के लिए करना चाहता था एक बार हल कर। तो चलो आप उन्हें एक गतिशील सरणी में डाल मान लें:
var MyDA Array of TExample;
...
SetLength(MyDA,NewSize); //allocate memory for the dynamic array
for i:=0 to NewSize-1 do begin //fill the array with records
MyDA[i].SortOrder := SomeInteger;
MyDA[i].SomethingElse := SomeString;
end;
अब आप पूर्णांक मान SortOrder द्वारा इस सरणी क्रमबद्ध करना चाहते हैं। यदि आप जो चाहते हैं वह एक TStringList है (इसलिए आप ts.find विधि का उपयोग कर सकते हैं) तो आपको प्रत्येक स्ट्रिंग को सूची में जोड़ना चाहिए और सॉर्टऑर्डर को पॉइंटर के रूप में जोड़ना चाहिए। एक TObject सूचक है, जो TStringList.Object संपत्ति में संग्रहीत किया जाता में पूर्णांक SortOrder कास्टिंग की चाल
var tsExamples: TStringList; //declare it somewhere (global or local)
...
tsExamples := tStringList.create; //allocate it somewhere (and free it later!)
...
tsExamples.Clear; //now let's use it
tsExamples.sorted := False; //don't want to sort after every add
tsExamples.Capacity := High(MyDA)+1 //don't want to increase size with every add
//an empty dynamic array has High() = -1
for i:=0 to High(MyDA) do begin
tsExamples.AddObject(MyDA[i].SomethingElse,TObject(MyDA[i].SortOrder));
end;
नोट: फिर सूचक क्रमित करें। (। इस तथ्य यह है कि पूर्णांक और सूचक एक ही आकार के होते हैं पर निर्भर करता है) कहीं न कहीं हम TObject संकेत तुलना करने के लिए एक समारोह को परिभाषित करना होगा: अब
function CompareObjects(ts:tStringList; Item1,Item2: integer): Integer;
var i,j: integer;
begin
Result := integer(ts.Objects[i]) - integer(ts.Objects[j];
end;
, हम बजाय .CustomSort फोन करके .Object पर tsList सॉर्ट कर सकते हैं .Sort की (स्ट्रिंग मान पर सॉर्ट जो जाएगा।)
tsExample.CustomSort(@CompareObjects); //Sort the list
TStringList
अब क्रमबद्ध हो जाता है, तो आप .Count -1 0 से इस पर पुनरावृति और क्रमबद्ध क्रम में तार पढ़ सकते हैं।
लेकिन मान लीजिए कि आप एक TStringList नहीं चाहते थे, क्रमबद्ध क्रम में केवल एक सरणी। या रिकॉर्ड में इस उदाहरण में केवल एक स्ट्रिंग की तुलना में अधिक डेटा होता है, और आपका सॉर्ट ऑर्डर अधिक जटिल होता है। आप प्रत्येक स्ट्रिंग को जोड़ने का चरण छोड़ सकते हैं, और केवल एक टीएलिस्ट में आइटम के रूप में सरणी अनुक्रमणिका जोड़ सकते हैं। उसी तरह से ऊपर सब कुछ करते हैं, TStringList के बजाय एक TList का उपयोग को छोड़कर:
for i:=0 to Mlist.Count-1 do begin
Something := MyDA[integer(Mlist[i])].SomeField;
end;
के रूप में: क्रमबद्ध क्रम में सरणी का उपयोग करने की
var Mlist: TList; //a list of Pointers
...
for i:=0 to High(MyDA) do
Mlist.add(Pointer(i)); //cast the array index as a Pointer
Mlist.Sort(@CompareRecords); //using the compare function below
function CompareRecords(Item1, Item2: Integer): Integer;
var i,j: integer;
begin
i := integer(item1); //recover the index into MyDA
j := integer(item2); // and use it to access any field
Result := SomeFunctionOf(MyDA[i].SomeField) - SomeFunctionOf(MyDA[j].SomeField);
end;
अब जब कि Mlist क्रमबद्ध हो जाता है, यह एक लुकअप तालिका के रूप में उपयोग मैं टीएलआईस्ट पर पुनरावृत्ति करता हूं, हम क्रमबद्ध क्रम में सरणी अनुक्रमणिका वापस प्राप्त करते हैं। हमें उन्हें पूर्णांक में वापस लाने की जरूरत है, क्योंकि टीएलिस्ट सोचता है कि वे पॉइंटर्स हैं।
मुझे यह तरीका पसंद है, लेकिन आप टीएलआईटी में सरणी तत्वों को वास्तविक सूचकांक भी डाल सकते हैं, इसके सूचकांक के बजाय सरणी तत्व का पता जोड़कर। फिर उनका उपयोग करने के लिए आप उन्हें TExample रिकॉर्ड्स के पॉइंटर्स के रूप में डालेंगे। बैरी केली और कूलमैजिक ने अपने उत्तरों में ऐसा करने के लिए कहा।
बस इस व्यायाम के माध्यम से चला गया और पाया सबसे अच्छा तरीका है अपने खुद के कोड लिखने के लिए है। मुझे नहीं लगता कि किसी भी उत्तर की सिफारिश ** ** के रूप में की जानी चाहिए। – Sam
प्वाइंट लिया गया। हो सकता है कि आप समस्या के समाधान के साथ भी एक उत्तर जोड़ सकें? – Marius
जूलियन बकनेल द्वारा डेल्फी एल्गोरिदम और डेटा संरचनाओं के टॉमस में कुछ अच्छी जानकारी है। (एस –