Как получить список элементов двух последовательностей, используя Set.intersection - PullRequest
0 голосов
/ 24 октября 2018

Я изучаю язык программирования Swift (Swift 4.2)

https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html

Можно ли написать универсальную функцию для возврата общих элементов любых двух последовательностей с помощью Set.пересечение ()?Я написал следующий метод (я учусь на C #, только учусь, поэтому, пожалуйста, извините за плохую практику программирования на Swift), но возможно ли это сделать, не зная тип элемента?

func getCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Array<Any>
where T.Element: Equatable, T.Element == U.Element
{
if let lhsSet = lhs as? Set<String> {
    if let rhsSet = rhs as? Set<String> {
        return Array(lhsSet.intersection(rhsSet))
    }
} else if let lhsSet = lhs as? Set<Double> {
    if let rhsSet = rhs as? Set<Double> {
        return Array(lhsSet.intersection(rhsSet))
    }
} else if let lhsArray = lhs as? Array<String> {
    if let rhsArray = rhs as? Array<String> {
        let lhsSet = Set<String>(lhsArray)
        let rhsSet = Set<String>(rhsArray)
        return Array(lhsSet.intersection(rhsSet))
    }
}
return [T.Element]()

}

getCommonElements(["FirstName", "MiddleName", "LastName"], ["FirstName", "LastName"])
let elementsSet1 = Set<Double>([1.2, 2.4, 3.6])
let elementsSet2 = Set<Double>([1.2, 3.6])
getCommonElements(elementsSet1, elementsSet2)

1 Ответ

0 голосов
/ 24 октября 2018

Да, вы все равно можете просто инициализировать Set со входа.Не имеет значения, является ли он Set или Array, так как ваш ввод Sequence и Set может быть инициализирован с Sequence.where T.Element: Hashable, T.Element == U.Element уже гарантирует, что типы элементов одинаковы и могут быть выполнены как Set

func getCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> [T.Element] 
    where T.Element: Hashable, T.Element == U.Element
{
   return Array(Set<T.Element>(lhs).intersection(Set<U.Element>(rhs)))
}

print(getCommonElements(["FirstName", "MiddleName", "LastName"], ["FirstName", "LastName"]))
let elementsSet1 = Set<Double>([1.2, 2.4, 3.6])
let elementsSet2 = Set<Double>([1.2, 3.6])
print(getCommonElements(elementsSet1, elementsSet2))

вывод:

["FirstName", "LastName"]
[1.2, 3.6]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...