我一直对这个问题感到忧虑,所以我想也许你们中的一些人可以对这种情况有所了解。
简而言之,我正在建立一个应用程序,从服务器获取学生的时间表,解析它,并在表格视图中显示它。每个学生每天有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
没有对象,所以我需要添加一个。我难以理解的是什么?对不起,如果是。
提前致谢!
答案 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
字段对所有内容进行排序。