将字典键与数组进行比较,以提取匹配和不匹配的数据。

3
我正在尝试检索Facebook好友列表,并显示用户是否关注了其他用户。为此,我使用存储在Parse后端的FacebookID,当用户单击“关注”按钮时,我将其FacebookId添加到parse中的“following”键值中。稍后,我检索此跟随键数组并显示当前用户正在关注或不关注的用户。
我的朋友清单:
var friend = ["902165525": "John", "10204125099": "Sam", "153822": "Sandy", "475585616": "Nito"]

我在关注:
var follow = ["10204125099", "153822"]

现在我想提取friend数组,在其中可以看到我“不关注”的朋友,即else块。
wantToGetThis -> ["902165525": "John", "475585616": "Nito"]

我所拥有的是:
    func check() {

    for all in self.follow {

        for (key, value) in friend {

            if key.containsString(all) {

                print("Yes: \(key), \(value)")

            } else {
                print("No: \(key), \(value)")

            }
        }
    }
}

这是我得到的 if 循环结果。
Yes: 10204125099, Sam

Yes: 153822, Sandy

这是我得到的else循环结果。
No: 153822, Sandy

No: 902165525, John

No: 475585616, Nito

No: 902165525, John

No: 10204125099, Sam

No: 475585616, Nito

我为什么在else块中得到了Sandy和Sam,以及多个John和Nito?这里有什么问题吗?

你尝试过调试你的代码吗?设置断点并逐步执行吗?在哪个点上执行不遵循你期望的路径? - Martin R
1
通常情况下,您会检查一个集合(朋友)是否包含一个子集(关注),而不是相反。 - vadian
2个回答

2

不应该在内部循环中打印任何内容。相反,您应该使用它来查看是否有任何项目与外部循环的当前项目匹配,并在循环结束后打印结果:

for (key, value) in friend {
    var found = false
    for all in self.follow {
        if key == all {
            found = true
            break
        }
    }
    if found {
        print("Yes: \(key), \(value)")
    } else {
        print("No: \(key), \(value)")
    }
}

请注意循环的顺序也需要改变:内部循环应该变成外部循环,这样当内部循环结束后,您仍然可以访问keyvalue

很抱歉,如果我不使用内部循环,我怎么能访问“key”和“value”呢? - NS1518
1
@Riding.Driving 你需要翻转你的循环,将外部循环放在内部。 - Sergey Kalinichenko
我刚刚在发了这条信息后就做了那件事。它起作用了。不过我有一个问题,随着数组大小的增加,哪个更有效?是我在这个问题中请求的for循环的方法还是@vadian上面发布的使用filter的方法? - NS1518

1

Swift的filter函数可以应用于字典,键/值对被视为元组。

let peopleIFollow = friend.filter{ follow.contains($0.0) }
let peopleIDontFollow = friend.filter{ !follow.contains($0.0) }
for person in peopleIFollow {
  print("I follow \(person.0) \(person.1)")
}
for person in peopleIDontFollow {
  print("I don't follow \(person.0) \(person.1)")
}

谢谢你。我现在有两个选项,一个来自你,另一个来自@dasblinkenligh。你认为哪一个在数组大小增加时会更有效率? - NS1518
我不知道。在这种情况下,使用两个单独的过滤操作,循环似乎是更有效的解决方案。你可以在playground中尝试一下:创建一个巨大的数组,并通过时间戳来测量两个选项的性能。 - vadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接