NSMutableSet 设置减组不工作

Posted

技术标签:

【中文标题】NSMutableSet 设置减组不工作【英文标题】:NSMutableSet Set Minus Set Not Working 【发布时间】:2014-05-15 02:19:06 【问题描述】:

我一定遗漏了一些基本的东西——希望有人能指出来。

我有两个 NSSet。集合 A 包含 40 个 NSNumber 值,集合 B 包含 20 个 NSNumber 值。集合 A 包含集合 B 的所有 20 个值以及集合不共享的 20 个其他值。

我想做的是:NSSet *newSet = Set A - Set B,其中新集合仅包含集合 A 中未包含在集合 B 中的 20 个值。虽然我使用的是“minusSet”,但我的新set 始终包含所有 40 个原始值。我已经记录了每组 A 和 B 的内容,以确保它们包含我上面描述的内容。

这是我的代码:

1) 创建集合 A(包含 40 个 NSNumber)

NSMutableSet *fetchedThreadIds = [NSMutableSet setWithArray:[threadedJsonMessages valueForKey:@"tid"]];

2) 创建集合 B(包含 20 个也在集合 A 中的 NSNumber)

NSSet *savedThreads = threadIdsForSavedThreads([fetchedThreadIds allObjects]);

3) 尝试从集合 A 中减去集合 B:

[fetchedThreadIds minusSet:savedThreads];

4) 将所有剩余对象添加到新数组中:

threadIdsForMessageFetch = [fetchedThreadIds allObjects];

但是,threadIdsForMessageFetch 包含 40 个对象而不是 20 个。当我打印每个集合时,我得到:

设置A

(
2540000000136987400,
2540000000141777055,
2540000000144609986,
2540000000125243232,
2540000000144610000,
2320000003021796109,
2540000000144375484,
2540000000136185765,
2540000000135311778,
2540000000135311816,
2540000000124128112,
2540000000125012438,
2480000001401011569,
2540000000144610015,
2540000000135311744,
2540000000139755359,
2540000000135311848,
2540000000143846308,
2540000000145732667,
2540000000143985955,
2540000000136185740,
2540000000135756434,
2540000000134373148,
2540000000140816249,
2540000000130860748,
2540000000127140093,
2540000000143526120,
2540000000102176392,
2540000000144609962,
2540000000128826163,
2540000000136185694,
2540000000133208691,
2540000000144555891,
2540000000138091838,
2540000000130179358,
2540000000126098342,
2540000000145162237,
2540000000131688927,
2540000000136185715,
2540000000143526101
)

设置 B

(
2540000000136987400,
2540000000138091838,
2540000000143985955,
2540000000144555891,
2540000000140816249,
2540000000145732667,
2540000000144609986,
2540000000144610000,
2540000000144609962,
2540000000144610015,
2540000000141777055,
2540000000143526101,
2540000000143526120,
2480000001401011569,
2540000000136185694,
2540000000145162237,
2540000000143846308,
2320000003021796109,
2540000000144375484,
2540000000139755359
)

新数组:

<__NSArrayI 0xc4b8e40>(
2540000000136987400,
2540000000141777055,
2540000000144609986,
2540000000125243232,
2540000000144610000,
2320000003021796109,
2540000000144375484,
2540000000136185765,
2540000000135311778,
2540000000135311816,
2540000000124128112,
2540000000125012438,
2480000001401011569,
2540000000144610015,
2540000000135311744,
2540000000139755359,
2540000000135311848,
2540000000143846308,
2540000000145732667,
2540000000143985955,
2540000000136185740,
2540000000135756434,
2540000000134373148,
2540000000140816249,
2540000000130860748,
2540000000127140093,
2540000000143526120,
2540000000102176392,
2540000000144609962,
2540000000128826163,
2540000000136185694,
2540000000133208691,
2540000000144555891,
2540000000138091838,
2540000000130179358,
2540000000126098342,
2540000000145162237,
2540000000131688927,
2540000000136185715,
2540000000143526101
)

减集调用前A和B的计数如下:

2014-05-14 22:37:00.900 App[35877:60b] fetchedThreadIdsCount = 40
2014-05-14 22:37:00.900 App[35877:60b] savedThreadsCount = 20

【问题讨论】:

请在minusSet: 调用之前添加NSLog 以获取两组计数。 NSNumbers 是整数还是浮点值?它们是如何创建的? 确保 threadIdsForMessageFetch 和 savedThreads 中的元素类型相同。 NSNumbers 是从 int64_t 值创建的...但那里可能有问题。 【参考方案1】:

我试过这个并且它有效,所以我猜测还有其他代码丢失或NSNumbers 真的不一样,只是打印的表示是一样的。

NSMutableSet *fetchedThreadIds = [NSMutableSet setWithObjects:@1, @2, @3, @4, nil];
NSSet *savedThreads = [NSSet setWithObjects:@2, @3, nil];
NSLog(@"fetchedThreadIds: %@", fetchedThreadIds);
NSLog(@"savedThreads: %@", savedThreads);

[fetchedThreadIds minusSet:savedThreads];
NSLog(@"fetchedThreadIds: %@", fetchedThreadIds);
NSArray *threadIdsForMessageFetch = [fetchedThreadIds allObjects];
NSLog(@"threadIdsForMessageFetch: %@", threadIdsForMessageFetch);

NSLog 输出:

fetchedThreadIds: ( 3、 2、 1、 4) 已保存线程:( 3、 2) fetchedThreadIds: ( 1、 4) threadIdsForMessageFetch: ( 1、 4)

作为主要用于格式化的答案发布。

【讨论】:

谢谢,我想我的数字实际上并不相同。

以上是关于NSMutableSet 设置减组不工作的主要内容,如果未能解决你的问题,请参考以下文章

观察 NSMutableSet 的键值对

NSSet和NSMutableSet 确保数据的唯一性--备

核心数据。对大尺寸 NSManagedObject 的 NSMutableSet 进行排序

核心数据:在 NSMutableSet 中查找 NSEntity Objects 的属性

为啥贪心硬币找零算法对某些硬币组不起作用?

AWS 安全组不允许入站流量