0

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

长话短说,我正在构建一个应用程序,它从服务器获取学生的时间表,对其进行解析,并将其显示在表格视图中。每个学生每天有 7 节课,在两周内有 10 天的时间表(A 周 5 天,B 周 5 天)。

然而,问题在于一些学生有空闲时间——也就是说,他们在那段时间没有课。因为服务器没有考虑空闲时间,所以一些学生可能会在两周内返回 70 个总时间,而另一些学生可能会返回 66 个。

在这里切入正题...

我有一个有序的 NSMutableArray,里面装满了 NSDictionaries。输出到控制台时,数组中的典型对象如下所示:

{
    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;
},

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

提前致谢!

4

3 回答 3

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;

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

于 2013-03-22T09:59:19.633 回答
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字段排序。

于 2013-03-22T10:34:47.117 回答
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;

    }
}
于 2013-03-22T09:55:27.230 回答