数组不删除重复项

时间:2013-01-10 01:34:30

标签: ios objective-c xcode core-data

我正在尝试将数据加载到核心数据的表视图中。但有些值是重复的。因此,在我用于获取数据的数组中,我试图告诉数组删除任何重复项,然后在表视图中显示它。但出于某种原因,它并没有删除重复项。这是代码:

已更新

- (void)viewDidLoad
{
    fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *weightEntity = [NSEntityDescription entityForName:@"Tracking" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:weightEntity];
    result = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];

    NSMutableArray *cleaningArray= [NSMutableArray new];
    NSSet *duplicatesRemover = [NSSet setWithArray:result];
    [duplicatesRemover enumerateObjectsUsingBlock: ^(id obj, BOOL* stop)
    {
        if(![cleaningArray containsObject: obj])
        {
            [cleaningArray addObject: obj];
        }
    }];

    cleanArray = [cleaningArray copy];

    [super viewDidLoad];

    // Do any additional setup after loading the view.
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    static NSString *CellIdentifier = @"Cell";

    mainCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (mainCell == nil) {
        mainCell = [[dictionaryTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Entity *person = [cleanArray objectAtIndex:indexPath.row];
    mainCell.nameLabel.text = person.date;

    return mainCell;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"%@", [cleanArray objectAtIndex:0]);
    return   cleanArray.count;
}

谢谢!

2 个答案:

答案 0 :(得分:2)

-containsObject比较字符串(如[string1 isEqual:string2])所以你可以这样做

NSArray* result = @[@"test",@"string",@"test",@"line"];
    NSMutableArray* cleanArray = [[NSMutableArray alloc] init];


   for (id object in result) {
        if (![cleanArray containsObject:object])
            [cleanArray addObject:object];
    }

NSLog (@"cleanArray %@",cleanArray);

日志:

cleanArray (
    test,
    string,
    line
)

更新
@dreamlax和我一直在和@Zack聊天。似乎NSSet / isEqual问题是一个红色的鲱鱼。 “result”数组不包含NSStrings,它包含对Core Data的提取请求,每个提取请求当然都是唯一的,即使返回的数据不是。该数组与表视图紧密耦合,表视图根据请求执行这些获取请求。

所以Zack需要做的是将Core Data与他的Table View分离,预取他想要比较的字符串的唯一性,并将这个单独的数组提供给Table View。 NSSet可以很好地获得一组独特的结果。

fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *weightEntity = 
        [NSEntityDescription entityForName:@"Entity" 
                                 inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:weightEntity]; 
result = [self.managedObjectContext executeFetchRequest:fetchRequest 
                                                      error:nil]; 
NSMutableSet *dateSet = [NSMutableSet alloc] init]; 

for (id object in result) { 
    Entity *person = object; 
    NSString* dateString = person.date; 
    [dateSet addObject:dateString]; 
} 

self.dateArray = [dateSet allObjects]; 

然后在他的tableView:

mainCell.nameLabel.text = [cleanArray objectAtIndex:indexPath.row];

答案 1 :(得分:1)

使用dreamlax的信用,这是覆盖isEqual:方法的问题,这就是NSSet不删除重复对象的原因。

在您的实体中,覆盖isEqual方法并在所有字段相等时返回true,例如:

- (BOOL)isEqual:(id)anObject
{
    return self.attribute_1 == anObject,attribute_1 && ... && self.attribute_N== anObject.attribute_N; // Primitive types comparison in this example
}