按顺序排序的NSMutableArray - 按顺序更换制动器

时间:2013-03-22 09:36:55

标签: ios objective-c nsmutablearray nsarray nsdictionary

我一直对这个问题感到忧虑,所以我想也许你们中的一些人可以对这种情况有所了解。

简而言之,我正在建立一个应用程序,从服务器获取学生的时间表,解析它,并在表格视图中显示它。每个学生每天有7个学期,并且在两个星期的时间表中有10天(A周为5天,B周为5天)。

然而问题在于一些学生有自由的时间 - 也就是说,他们在那段时间没有上课。由于服务器没有考虑免费期,一些学生可能在两周内返回70个总周期,而另一个学生可能会返回66个。

切入这里追逐......

我有一个完整的NSDictionaries的有序NSMutableArray。输出到控制台时,数组中的典型对象看起来像这样:

{
    weekday = 12;
    period = 1;
    room = "Room D404";
    title = "English Extension";
},

我需要找出订单中断的位置,如果是,请在其中插入一个对象以填充空白。让我举个例子:

{
    dayweek = 12;
    period = 1;
    room = "Room D404";
    title = "English Extension";
},
    {
    dayweek = 12;
    period = 2;
    room = "Room W285";
    title = "Modern History";
},
    {
    dayweek = 12;
    period = 3;
    room = "Room W187";
    title = "Maths Extension 1";
},
    {
    dayweek = 12;
    period = 4;
    room = "Room W370";
    title = Economics;
},
    {
    dayweek = 12;
    period = 6;
    room = "Room D301";
    title = "English Advanced";
},
    {
    dayweek = 12;
    period = 7;
    room = "Room W282";
    title = "Studies of Religion";
},
    {
    dayweek = 13;
    period = 1;
    room = "Room W370";
    title = Economics;
},

period = 5没有对象,所以我需要添加一个。我难以理解的是什么?对不起,如果是。

提前致谢!

3 个答案:

答案 0 :(得分:2)

这填补了从1到最后一天存在的缺失期。它不会在给定的最短时间内填满数天。

NSMutableArray periods; // from somewhere else

NSUInteger count = [periods count];
NSUInteger currentPeriod = 0;
NSUInteger currentDayweek = 0;
for (NSUInteger i = 0; i < count; ++i)
{
    NSDictionary *periodDescription = periods[i];
    NSUInteger dayweek = [periodDescription[@"dayweek"] unsignedIntegerValue];
    if (dayweek != currentDayweek) {
        // another day
        currentPeriod = 0;
        currentDayweek = dayweek;
    }
    NSUInteger period = [periodDescription[@"period"] unsignedIntegerValue];
    currentPeriod += 1;
    while (period > currentPeriod) {
        NSDictionary *fillIn = @{ @"dayweek" : @(dayweek), @"period" : @(currentPeriod), @"room" : @"cafeteria", @"title" = "taking a break" };
        [periods insertObject:fillIn atIndex:i];
        currentPeriod += 1;
        i += 1;
        count += 1;
    }
}

如果您不想在第一个现有时段之前填写早晨时间,请在while循环之前直接添加:

    if (currentPeriod == 1)
        currentPeriod = period;

注意:在浏览器中键入,可能会出错。

答案 1 :(得分:0)

尝试此操作,如果您遇到任何问题,请告知我们

for (int i = 1; i<=self.arrayForRows.count; i++)
{
    if ([[[self.arrayForRows objectAtIndex:i]valueForKey:@"period"] intValue] == i)
    {
    }
    else
    {
        // Insert Here as [self.arrayForRows insertObject:yourObject atIndex:i];
         i=i-1;

    }
}

答案 2 :(得分:0)

这只是一个部分答案,但发表评论的时间太长了。

此代码段的目的只是用最少量的代码识别缺失的句点。当然,你需要在两周的所有日子里循环完成。

要执行此操作,您可以使用谓词:

// For each day create a list of all periods. 
// This is just a hard coded example
NSArray *allPeriodsForDay = @[@(1),@(2),@(3),@(4),@(5),@(6)];


// Get an array of the periods actually in the list
// It will look like this: @[@(1),@(2),@(4),@(5),@(6)]; // Period 3 missing
NSArray *studentsPeriods  = [periodRecords valueForKey: @"period"];

// Build a predicate to identify period(s) not in list
NSPredicate *freePredicate = [NSPredicate predicateWithFormat:@"not self in %@", studentsPeriods];

NSArray *freePeriods = [allPeriodsForDay filteredArrayUsingPredicate:freePredicate];

freePeriods现在包含当天学生日程安排中“缺失”期间的列表。

然后,您可以创建新的NSDictionary并将其添加到列表中。然后按period字段对所有内容进行排序。