【问题标题】:How do you compare two arrays to get the count of similar objects?你如何比较两个数组来获得相似对象的数量?
【发布时间】:2018-04-16 15:27:54
【问题描述】:

我有两个字符串数组,每个数组的内容和数据量都是唯一的。

我希望能够找到两个数组中出现的项目数的count

例子:

var array1 = ["Duck", "Dog", "Cat", "Bird", "Elephant", "Cow", "Goat", "Goose"]
var array2 = ["Eagle", "Giraffe", "Cow", "Elephant", "Sheep", "Penguin", "Rhinoceros"]

这应该打印 2,因为 Cow 和 Elephant 出现在 array1 和 array2 中。

我的进度如下。这会引发错误:闭包元组参数'(offset: Int, element: (String, String))' 不支持使用隐式参数进行解构

let compared = zip(array1, array2).enumerated().filter() {
    $1.0.id == $1.1.id
}.count

print(compared)

如何找到出现在两个数组中的项目数? 请注意,永远不会有 3 个或更多数组。总是会比较 2 个数组。

【问题讨论】:

  • 它们是否也总是相同的长度并且每个数组中的元素不会重复??
  • 没有。这里唯一一致的因素是总会有 2 个数组。内容和长度会有所不同。编辑:顺序也不一致。
  • 同一个数组中的重复元素?

标签: ios arrays swift compare


【解决方案1】:

您可以创建一个通用函数,通过返回从Arrays 创建的两个Sets 的交集来返回两个数组的公共元素。需要Hashable 泛型类型限制,因为Set 的元素需要符合Hashable

func commonElements<T:Hashable>(between array1:[T],and array2:[T])->[T]{
    return Array(Set(array1).intersection(Set(array2)))
}

commonElements(between: array1, and: array2) // ["Cow", "Elephant"]

如果您只对此类元素的数量感兴趣,您可以简单地在返回值上调用count

commonElements(between: array1, and: array2).count // 2

【讨论】:

  • 感谢您更详细的解释@Dávid,。这些信息很有帮助!
【解决方案2】:

或许你可以使用Set操作:

var array1 = ["Duck", "Dog", "Cat", "Bird", "Elephant", "Cow", "Goat", "Goose"]
var array2 = ["Eagle", "Giraffe", "Cow", "Elephant", "Sheep", "Penguin", "Rhinoceros"]

print( Set(array1).intersection(array2).count ) //-> 2

【讨论】:

  • 这真是太快了!奇迹般有效!!谢谢@OOPer
  • @Joe,请记住,如果您想使用除== 之外的其他相等性检查(例如不区分大小写的比较),使用Set 会有点困难。
  • 感谢您的提醒。对于此比较,它始终区分大小写,因此您的解决方案应该可以正常工作。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多