ما هو روبي (1.8.7) التناظرية إلى SortedDictionary في C#/.الشبكة ؟
-
29-09-2019 - |
سؤال
أنا في حاجة إلى الاستمرار القيم في فرز التجزئة في روبي (1.8.7).ما هي البيانات structed تناسب أفضل ؟
المحلول
لا يوجد شيء في المكتبة الأساسية أو المكتبة القياسية الآن ، والتي تناسب فاتورتك.
هناك هو, ، ومع ذلك، طلب ميزة لإضافة تطبيق أحمر/أسود شجرة إلى Ruby 1.9.3/2.0.
إذا كنت قادرًا على إجبار المستخدمين على استخدامك فقط xruby أو جروبي, ، يمكنك فقط استخدام أحد تطبيقات Java java.util.SortedMap<K, V>
مثل java.util.TreeMap<K, V>
.
إذا كنت قادرًا على إجبار المستخدمين على استخدامك فقط ruby.net أو Ironruby, ، يمكنك فقط استخدام .NET's System.Collections.Generic.SortedDictionary<TKey, TValue>
.
إذا كنت قادرًا على إجبار المستخدمين على استخدام التصوير بالرنين المغناطيسي أو YARV ، فيمكنك استخدام Ruby/RBTree
مكتبة. قد تعمل أيضًا روبينيوس أو JRuby 1.6 الذي لم يتم إصداره لك. لاحظ أنه يبدو أن هناك شوكات محدثة متعددة مستقلة لتلك المكتبة في البرية. هذا ليس واضحًا ، وهو أحد هؤلاء هو الأحدث و/أو الأفضل الحفاظ عليه.
ال فقط الحل الذي أعرفه مضمون أن يكون محمولًا ، هو مشروع خوارزميات وحاويات Kanwei Li GSOC 2008, ، الذي يحتوي في الواقع على اثنين من التطبيقات لمجموعة مصنفة ومفاسدة: Containers::RBTreeMap
بناء على شجرة حمراء/سوداء و Containers::SplayTreeMap
بناءً على شجرة شديدة.
نصائح أخرى
قد تضطر إلى دحرج هذا بنفسك ، إذا لم يكن لدى أي شخص آخر اقتراح أفضل.
class SortedHash
def initialize
@data = []
end
def [](k)
@data.find {|kp,vp| kp == k}.last
end
def []=(k, v)
@data.reject! {|kp,vp| kp == k}
@data << [k, v]
@data = @data.sort_by {|kp,vp| kp}
end
def each(&b)
@data.each(&b)
end
end
sh = SortedHash.new
sh[32] = "no"
sh[1] = "later"
sh[99] = "after"
sh.each do |k,v|
p [k,v]
end
انتاج:
[1, "later"]
[32, "no"]
[99, "after"]
يتم فرز Array بواسطة Keys ، بحيث يمكن أن تكون من أي مكالمة وتحتاج فقط إلى تحديد مشغلي المقارنة عليها.
استخدام نفس الدرجة في c# SortedDictionary :
SortedDictionary keyValues = new SortedDictionary();
keyValues.Add(5,"sample5");
keyValues.Add(2, "sample2");
keyValues.Add(6, "sample6");
keyValues.Add(8, "sample8");
keyValues.Add(9, "sample9");
keyValues.Add(1, "sample1");