هل يمكنني تحويل الكائنات في NSMutableArray دون خلق مؤقت المصفوفة ؟
-
08-07-2019 - |
سؤال
ظننت بأن الأمر كان مع ،
void shiftArray(NSMutableArray *mutableArray, NSUInteger shift)
{
for (NSUInteger i = 0; i < [mutableArray count]; i++) {
NSUInteger newIndex = (i + shift) % [mutableArray count];
[mutableArray exchangeObjectAtIndex:i withObjectAtIndex:newIndex];
}
}
الذي يتحول 0,1,2,3,4 في 0,2,3,4,1 عندما تحول من جانب واحد.
والنتيجة المتوقعة هي 4,0,1,2,3
أشعر أن أنا في عداد المفقودين شيء واضح...
تحديث: شكرا ماتيو ، وهذا هو ما وظيفة يبدو الآن.
void shiftArrayRight(NSMutableArray *mutableArray, NSUInteger shift) {
for (NSUInteger i = shift; i > 0; i--) {
NSObject *obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
}
لم أكن أعلم أنك يمكن أن تجعل عام NSObject ووضع بعض فرعية في ذلك.الأمر كله مجرد مؤشرات لذلك أعتقد أنه على ما يرام, أليس كذلك ؟
من الصعب كسر هذه العادة من التفكير في هذه الأشياء أكياس من الاشياء بدلا من مؤشرات إلى الحقيبة.
المحلول
محاولة شيء من هذا القبيل
for (NSUInteger i = shift; i > 0; i--) {
NSObject* obj = [mutableArray lastObject];
[mutableArray insertObject:obj atIndex:0];
[mutableArray removeLastObject];
}
التحذير -- أنا لم تختبر هذا الرمز ، ولكن ينبغي أن تساعدك على حل المشكلة.
نصائح أخرى
كنت بحاجة الى ان ننظر مرة أخرى في الخوارزمية.في كل مرة خلال الحلقة ، تبادل عنصر واحد مع (في حالة التحول=1) واحد القادم.
0,1,2,3,4
1,0,2,3,4
1,2,0,3,4
1,2,3,0,4
1,2,3,4,0
0,2,3,4,1
يمكنك القيام بالعملية كنت تريد أن تفعل, ولكن تحتاج إلى التفكير حول كيفية ترتيب الخطوات و تبعيات للحصول على النتيجة الصحيحة.في تافهة الحالة ، يمكنك العمل فقط المتخلفة من النهاية.
0,1,2,3,4
4,1,2,3,0
4,1,2,0,3
4,1,0,2,3
4,0,1,2,3