سؤال

ما هي الطريقة الأكثر فعالية لفرز الكائنات في NSSet / NSMutableSet على أساس خاصية الكائنات في المجموعة؟ الآن الطريقة وأنا أفعل ذلك هي عن طريق بالتكرار عبر كل كائن، وإضافتها إلى NSMutableArray، وفرز هذا الصفيف مع NSSortDescriptor.

هل كانت مفيدة؟

المحلول

وحاول استخدام

[[mySet allObjects] sortedArrayUsingDescriptors:descriptors];

تعديل : في لدائرة الرقابة الداخلية ≥ 4.0 و Mac OS X ≥ 10.6 يمكنك استخدامها مباشرة

[mySet sortedArrayUsingDescriptors:descriptors];

نصائح أخرى

وو"الطريقة الأكثر فعالية" لتصنيف مجموعة من الأشياء تختلف بحسب ما تعنيه فعلا. افتراض عارضة (التي تجعل الأجوبة السابقة) هو نوع لمرة واحدة من الكائنات في مجموعة. في هذه الحالة، وانا اقول انها الى حد كبير متساوية بين ما <م>cobbal يشير إلى وما خطرت - ربما شيء كما يلي:

NSMutableArray* array = [NSMutableArray arrayWithCapacity:[set count]];
for (id anObject in set)
    [array addObject:anObject];
[array sortUsingDescriptors:descriptors];

و(أقول انها إرم المتابعة ل @cobbal في نهج يخلق اثنين من صفائف autoreleased، وبالتالي فإن الذاكرة الزوجي البصمة، وهذا هو غير منطقي لمجموعات صغيرة من الأشياء، ولكن من الناحية الفنية، لا نهج فعال جدا).

على ولكن ، أو إذا كنت فرز العناصر في المجموعة أكثر من مرة (وخاصة اذا كان شيء عادي) وهذا بالتأكيد ليس نهج فعال. هل يمكن إبقاء NSMutableArray حول والاحتفاظ بها متزامنة مع NSSet، ثم استدعاء -sortUsingDescriptors: في كل مرة، ولكن حتى لو يتم فرز مجموعة بالفعل فإنه لا يزال يتطلب مقارنات N

.

والكاكاو في حد ذاته فقط لا يوفر نهج فعال للحفاظ على جمع من أجل فرزها. جافا لديه TreeSet الطبقة التي تحافظ على العناصر من أجل فرزها كلما يتم إدراج كائن أو إزالتها، ولكن الكاكاو لا. وهذا بالذات هو المشكلة التي دفعني لتطوير شيئا من هذا القبيل للاستخدام الخاص.

وكجزء من إطار هياكل البيانات لقد ورثت وتجديده، أنا خلق وعدد قليل من تطبيقات لمجموعات فرزها . أي من الفئات الفرعية ملموسة ستحافظ على مجموعة من الكائنات متميزة في ترتيب فرزها. لا تزال هناك التحسينات ليكون - وقبل كل شيء هو أن ذلك أنواع على أساس نتيجة -compare: (والذي كل كائن في المجموعة يجب تنفيذ) ولا بعد قبول NSSortDescriptor. (A الحل هو تنفيذ -compare: لمقارنة الممتلكات ذات الأهمية على الكائنات)

وعيب واحد ممكن هو أن هذه الفئات هي (حاليا) لا فرعية من NS (متقلب) مجموعة، حتى إذا كان يجب أن يمر على NSSet، لن يكون امر به. (البروتوكول لديه وسيلة -إعداد والتي ترجع إلى NSSet، الذي هو بطبيعة الحال غير مرتبة.) أخطط لتصحيح هذا قريبا، كما فعلت مع الفئات الفرعية NSMutableDictionary في هذا الإطار. ردود الفعل هو موضع ترحيب بالتأكيد. : -)

لدائرة الرقابة الداخلية ≥ 5.0 و Mac OS X ≥ 10.7 يمكنك استخدامها مباشرة NSOrderedSet

وNSSet هو مجموعة من الكائنات غير مرتبة. وعند النظر إلى تفاحة المراجع صالحة يتم ترتيب المجموعات.

وعند النظر إلى NSArray هناك مناقشة مع الأمثلة الفرز في <وأ href = "https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Collections/Articles/Arrays.html#//apple_ref/doc/uid/20000132-SW8" يختلط = "نوفولو noreferrer "> http://developer.apple.com/documentation/Cocoa/Conceptual/Collections/Articles/sortingFilteringArrays ...

وعلى سبيل المثال من خلال الرابط:

NSInteger alphabeticSort(id string1, id string2, void *reverse)
{
    if (*(BOOL *)reverse == YES) {
        return [string2 localizedCaseInsensitiveCompare:string1];
    }
    return [string1 localizedCaseInsensitiveCompare:string2];
}

// assuming anArray is array of unsorted strings

NSArray *sortedArray;

// sort using a selector
sortedArray =
    [anArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

// sort using a function
BOOL reverseSort = NO;
sortedArray =
    [anArray sortedArrayUsingFunction:alphabeticSort context:&reverseSort];

ولا يمكنك فرز NSSet، لأن "sortedArrayUsingFunction:" مجموعة النتيجة كما NSArray ... وكل تلميح العلوي يعمل مع صفيف الوحيد:)

NSArray *myArray = [mySet sortedArrayUsingDescriptors:descriptors];

والعمل الكمال، وليس بحاجة الى وسيلة أخرى:)

ومنذ OS X 10.7 ودائرة الرقابة الداخلية 5.0 هناك NSOrderedSet. يمكنك استخدامه للحفاظ على الكائنات في مجموعة والحفاظ على ترتيبها. NSMutableOrderedSet لديها طرق للفرز. في بعض الحالات قد تعطي تحسين الأداء، حيث لم يكن لديك لإنشاء كائن منفصل مثل NSArray لتخزين المواد التي تم فرزها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top