NSSet получает NSStrings без всякой причины - PullRequest
0 голосов
/ 28 марта 2012

Я создаю игру, в которой используются файлы CSV, содержащие набор местоположений.

Вот краткая выдержка из одного из файлов CSV.

Name,Region,Country,Type
Bath,Somerset,United Kingdom,City
Brighton and Hove,Sussex,United Kingdom,City
Canterbury,Kent,United Kingdom,City
Chichester,West Sussex,United Kingdom,City
Durham,Durham,United Kingdom,City
Clevedon,Somerset,United Kingdom,Town

Я написал класс, который считывает эти данные и создает массив, содержащий поля (имя, регион, страну, тип) и другой многомерный массив, который содержит все строки данных (все, что находится ниже полей).

В MySql есть функция для группировки строк из определенного поля вместе, удаляя все дубликаты, которые я реализовал в своем классе. Вот где мои проблемы.

Я использовал эту функцию для группировки поля Region, которое, если оно использовалось в данных CSV выше, вернуло бы массив, содержащий Сомерсет, Сассекс, Западный Сассекс, Дарем, Кент. (Обратите внимание, что есть только один Сомерсет вместо двух выше). Как бы то ни было, он возвращает регионы с пробелами в конце, т. Е. "Сомерсет".

Я проверил файл CSV и удалил все найденные пробелы и убедился, что в них нет областей с ошибками, но это не помогло. И когда я вывожу все регионы в консоли перед моими группами классов, все регионы выглядят нормально.

Однако я обнаружил, что когда регионы помещаются в NSSet, возникают проблемы. Регионы, у которых нет пробелов после них в данных CSV, внезапно имеют дублированную версию себя с пробелом в конце. (т.е. NSSet имеет Somerset и «Somerset», когда он должен иметь только Somerset).

Нет ничего плохого в CSV, и моя процедура чтения файлов успешно проанализировала CSV, поскольку я правильно получаю все данные. Только когда я помещаю это в NSSet, я получаю проблемы, которые являются странными, поскольку это должно было удалить дубликаты отлично.

Вот мой код для класса CSV

Заголовок:

  //
    //  CSV.h
    //  Guess The Distance
    //
    //  Created by James Campbell on 15/02/2012.
    //  Copyright (c) 2012 Cirencester College. All rights reserved.
    //

    #import <Foundation/Foundation.h>

    @interface CSV : NSObject {
        NSMutableArray *fields;
        NSMutableArray *rows;
    }
    @property (strong, readonly) NSMutableArray *fields;
    @property (strong, readonly) NSMutableArray *rows;
    -(CSV *)initWithCSVNamed:(NSString *)name fieldSeperator:(NSString *)fieldSeperator rowSeperator:(NSString *)rowSeperator;
    -(NSDictionary *)getRowAtIndex:(NSUInteger)index;
    -(NSArray *)getRowsForField:(NSString *)field Group:(BOOL)group;
    @end

Реализация:

//
//  CSV.m
//  Guess The Distance
//
//  Created by James Campbell on 15/02/2012.
//  Copyright (c) 2012 Cirencester College. All rights reserved.
//

#import "CSV.h"

@implementation CSV
@synthesize fields, rows;
-(CSV *)initWithCSVNamed:(NSString *)name fieldSeperator:(NSString *)fieldSeperator 
    rowSeperator:(NSString *)rowSeperator{
    self = [super init];
    NSLog(@"Reading CSV File...");
    NSString *filePath;
    if ([[name pathExtension] isEqualToString:@""]){
        filePath = [[NSBundle mainBundle] pathForResource:name ofType:nil];
    } else {
        filePath = [[NSBundle mainBundle] pathForResource:[[name lastPathComponent] stringByDeletingPathExtension] ofType:[name pathExtension]];
    }
    NSData *csvData = [NSData dataWithContentsOfFile:filePath]; 
    if (csvData) {  
        NSString *csvString = [[NSString alloc] initWithData:csvData encoding:NSASCIIStringEncoding];
        NSArray *csvRows = [csvString componentsSeparatedByString:rowSeperator];
        rows = [[NSMutableArray alloc] initWithCapacity:[csvRows count]-1];
        __block NSIndexSet *fieldIndexes;
        [csvRows enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSArray *csvFields = [(NSString *)obj componentsSeparatedByString:fieldSeperator];

            if(idx == 0){
                 fieldIndexes = [csvFields indexesOfObjectsPassingTest:
                                       ^BOOL (id el, NSUInteger i, BOOL *stop) {
                                           return (![(NSString *)el isEqualToString:@""]);
                                       }];
                fields = [[NSMutableArray alloc] initWithArray:[csvFields objectsAtIndexes:fieldIndexes]];;
            } else {
                [rows insertObject:[csvFields objectsAtIndexes:fieldIndexes] atIndex:idx-1];
            }
        }];
    }
    return self;
}
-(NSDictionary *)getRowAtIndex:(NSUInteger)index{
    NSArray *row = [rows objectAtIndex:index];
    return [[NSDictionary alloc] initWithObjects:row forKeys:fields];
}

-(NSArray *)getRowsForField:(NSString *)field Group:(BOOL)group{
    NSUInteger fieldIndex = [fields indexOfObject:field];
    id items;
    if (!group){
         NSMutableArray *itemArray = [[NSMutableArray alloc] init];
        items = itemArray;
    } else {
        NSMutableSet *itemSet = [[NSMutableSet alloc] init];
        items = itemSet;
    }
    [rows enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString *row = [(NSArray *)obj objectAtIndex:fieldIndex];
        NSLog(@"|%@|", row);
        [items addObject:row];
    }];
    NSLog(@"%@", [items description]);
    if (!group){
        return [items copy];
    } else {
        return  [items allObjects];
    }
}
@end
...