我想要实现的是将csv文件转换为自定义对象数组,但是,我对此的尝试似乎导致数组中的所有对象都作为同一个对象返回(最后一个对象)在数组中)。
在我进一步解释之前,这里是代码:
- (NSArray *)arrayFromCSVFileName:(NSString *)csvFileName fileType:(NSString *)fileType {
// Convert the file into an NSData object
NSString *studentFilePath = [[NSBundle mainBundle] pathForResource:csvFileName ofType:fileType];
NSData *studentData = [NSData dataWithContentsOfFile:studentFilePath];
// Convert the NSData into an NSString
NSString *csvString = [[NSString alloc] initWithData:studentData encoding:NSUTF8StringEncoding];
// Split each record (line) in the csvDataString into an individual array element (split on the newline character \n)
NSArray *csvArray = [csvString componentsSeparatedByString:@"\n"];
// Create an array to hold the parsed CSV data
NSMutableArray *parsedCSVArray = [[NSMutableArray alloc] init];
NSMutableArray *elementArray = [[NSMutableArray alloc] init];
CGSElement *elementToAdd = [[CGSElement alloc] init];
// Loop through each line of the file
for (int i = 0; i < [csvArray count]; i++) {
// Get a reference to this record (line) as a string, and remove any extranous new lines or alike
NSString *csvRecordString = [[csvArray objectAtIndex:i] stringByReplacingOccurrencesOfString:@"\r" withString:@""];
// Split the line by the comma delimeter
NSArray *csvRecordArray = [csvRecordString componentsSeparatedByString:@","];
// Check that there are actually fields (i.e. this is not a blank line)
if ( ([csvRecordArray count] > 0) && ([[csvRecordArray objectAtIndex:0] length] > 0) ) {
elementToAdd.mass = [[csvRecordArray objectAtIndex:1] floatValue];
elementToAdd.atomicNumber = [[csvRecordArray objectAtIndex:0] intValue];
elementToAdd.name = [csvRecordArray objectAtIndex:2];
elementToAdd.symbol = [csvRecordArray objectAtIndex:3];
elementToAdd.period = [[csvRecordArray objectAtIndex:4] intValue];
[elementArray addObject:elementToAdd];
}
}
for (int i = 0; i < [elementArray count]; i++) {
NSLog(@"%i", i);
CGSElement *current = [elementArray objectAtIndex:i];
NSLog(@"Name = %@", current.name);
}
// Return the parsed array
return elementArray;
}
有问题的自定义对象是CGSElement对象,我试图填充elementArray
。但是,我的调试代码(以下代码部分):
for (int i = 0; i < [elementArray count]; i++) {
NSLog(@"%i", i);
CGSElement *current = [elementArray objectAtIndex:i];
NSLog(@"Name = %@", current.name);
}
结果是,而不是返回所有正确的元素名称,它返回最后一个元素(将其置于上下文中,ununoctium),118次。
经过一些测试,我可以肯定地说,直到这一点之后:
elementToAdd.mass = [[csvRecordArray objectAtIndex:1] floatValue];
elementToAdd.atomicNumber = [[csvRecordArray objectAtIndex:0] intValue];
elementToAdd.name = [csvRecordArray objectAtIndex:2];
elementToAdd.symbol = [csvRecordArray objectAtIndex:3];
elementToAdd.period = [[csvRecordArray objectAtIndex:4] intValue];
正确定义了所有元素,而不是一遍又一遍地使用相同的元素。
毋庸置疑,我很难过为什么会一遍又一遍地回归同一个物体。任何帮助将不胜感激。
答案 0 :(得分:2)
这一行:
CGSElement *elementToAdd = [[CGSElement alloc] init];
应该在您的循环内,就在您尝试编辑对象并将其添加到数组之前。目前,您反复改变同一个对象,而不是为每条记录创建新对象。
答案 1 :(得分:1)
您始终添加相同的实体。它在循环之前被创建一次,并且在循环内它的值再次被更改并且angan并且它被添加到数组中。当然,aray中的所有项都带有相同的值,因为它是同一个对象。
如果需要,则使用NSSet更改数组。对于一个集合,一个对象只能添加一次,你最终会得到一组1.这不是couse的解决方案,它只是可视化正在发生的事情。
要解决它,请移动此行
CGSElement *elementToAdd = [[CGSElement alloc] init];
到for i
循环体的开头,这样就可以为每次迭代创建一个新实例,从而为数组的每个索引创建一个新实例。