Как сравнить массив с вложенным массивом и вывести совпадающие пары, а не список совпадающих значений? (Код помогает объяснить) - PullRequest
1 голос
/ 11 апреля 2020

Я не совсем уверен, как выразить это словами, но код должен помочь.

var People = [

      .init(name: "Sam", friends: ["James", "Tom", "Rick"]),
      .init(name: "Tom", friends: ["Callum", "Steve", "Sam"]),
      .init(name: "Adam", friends: ["Harry", "Diane", "William"]),
      .init(name: "William", friends: ["Rodger", "Adam", "Bill"]),
      .init(name: "Guy", friends: ["Zack", "Frank", "Cody"])
]

Я хочу создать предупреждение, которое печатает

" Sam is in the same social circle as Tom " / " Tom is in the same social circle as Sam "

и

" Adam is in the same social circle as William " / " William is in the same social circle as Adam "

и

" Guy has no common social circles "

Я пытался это сначала создать массив имен: [String], затем сделать то же самое для друзей, преобразовав [[String]] [String] используя следующие функции ...

func loadNamesArray() -> [String] {
    return self.People.map { $0.name }
}

func loadFriendsArray() -> [String] {
    let arrayOfFriends = self.People.map { $0.friends }
    let friends = arrayOfFriends.flatMap { $0 }
    return friends
}

Затем я сравнил два массива, чтобы предупредить всех простых людей, использующих эту функцию ...

func loadCommonInteractingArray() -> [String] {
    let output = loadNamesArray().filter{ loadFriendsArray().contains($0) }

    return output
}

Но это просто возвращает ["Сэм", "Том", "Адам", "Уильям"], и я не уверен, куда отсюда go получить желаемые результаты, т.е. определить совпадающие пары, а не просто список из них. этот матч

Спасибо

Ответы [ 2 ]

1 голос
/ 11 апреля 2020
struct Person {
    let name: String
    let friends: [String]
}

var people: [Person] = [
      .init(name: "Sam", friends: ["James", "Tom", "Rick"]),
      .init(name: "Tom", friends: ["Callum", "Steve", "Sam"]),
      .init(name: "Adam", friends: ["Harry", "Diane", "William"]),
      .init(name: "William", friends: ["Rodger", "Adam", "Bill"])]

func loadCommonInteracting(in people: [Person]) -> [String] {
    var connections: [String] = []
    people.forEach { person in
        let friends = people.filter{ $0.friends.contains(person.name) }
        for friend in friends {
            connections.append("\(person.name) is in the same social circle as \(friend.name)")
        }

    }
    return connections
}

let connections = loadCommonInteracting(in: people)
for connection in connections {
    print(connection)
}

Будет напечатано

Сэм в том же круге, что и Том

Том в том же обществе круг общения с Сэмом

Адам находится в том же круге, что и Уильям

Уильям находится в том же круге, что и Адам

1 голос
/ 11 апреля 2020

Насколько я понимаю, вы пытаетесь найти каждого человека, включенного в массив friends любого другого человека.

for person in people {
    let others = people.filter {$0 != person}

    for other in others {
        if other.friends.contains(person.name) {
            print("\(person.name) is in the same social circle as \(other.name)")
        }
    }
}

People класс модели должен соответствовать Equatable, чтобы сделать выше.

...