Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c distinctUnionOfObjects不区分大小写_Objective C_Nsarray_Unique - Fatal编程技术网

Objective c distinctUnionOfObjects不区分大小写

Objective c distinctUnionOfObjects不区分大小写,objective-c,nsarray,unique,Objective C,Nsarray,Unique,我有一个字典数组。每个数组项都有一个名为Name的键。现在,我想删除基于此名称值的重复条目 这项工作非常完美: aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects.Name"]; 问题是结果数组仍然包含重复的字符串,这取决于大小写。例:[法郎,法郎] 如何删除这些副本 谢谢您可以尝试这样做 // in your class implementation - (BOOL)isEqual:(id)object {

我有一个字典数组。每个数组项都有一个名为Name的键。现在,我想删除基于此名称值的重复条目

这项工作非常完美:

aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects.Name"];
问题是结果数组仍然包含重复的字符串,这取决于大小写。例:[法郎,法郎]

如何删除这些副本


谢谢

您可以尝试这样做

// in your class implementation 
- (BOOL)isEqual:(id)object {
    if (![object isKindOfClass:[self class]]) {
        return NO;
    }
    typeof(self) obj = (typeof(self))object;
    return ([self.Name caseInsensitiveCompare:obj.Name] == NSOrderedSame);
}

- (NSUInteger)hash
{
    return [[self.Name lowercaseString] hash];
}

// and then 
NSSet *distinctObjects = [[NSSet alloc] initWithArray:array];
NSArray *result = distinctObjects.allObjects;
或者,您可以通过swizzling valueForKeyPath:来定制这个KVC收集操作符,以解析您的定制DSL,可能会使用类似的方式结束

aMyArray = [aMyArray valueForKeyPath:@"@distinctUnionOfObjects[caseInsensitive].Name"];

这对我来说似乎不是个好主意,但它确实是解决你问题的可行办法

在过滤掉重复的元素之前应用-小写或大写字符串或大写字符串怎么样?因为我需要保留大小写。对于复制,我不在乎删除哪一个好,如果你不在乎,你可以随时复制数组并通过UUID检索原始对象。如果代价太高,您可以始终使用NSSet而不是NSArray,并重写类的-isEqual和-hash。您的-hash方法对于给定的-isEqual:方法无效。规则是,如果-isEqual:认为两个对象相等,那么-hash方法必须为这两个对象提供相同的哈希值。如果两个名称的大小写不同,[NSString hash]可能会给出不同的哈希值,但是您的-isEqual:方法会将它们称为相等。哎呀,我忘记了在获取哈希值之前对名称进行标准化。谢谢