Некоторые строки в массиве соответствуют другому массиву

-2

Я не могу понять, как отличать массив от целого массива, и я хочу притвориться, что мы не знаем, что userInData [0,1,2,3] совпадает с провереннымUsers [0,1,2, 3], я хочу как-то сопоставить одно и то же значение без использования индекса каждого массива.

Я попробовал this-

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]

var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

if usersInData == verifiedUsers {
    print("special user")
} else {
    print("regular user") 
}

но он печатает "обычного пользователя", поэтому в основном это не сработало. Я хочу, чтобы проверенные пользователи отличались от обычных пользователей. Так, например, пользователь "привет" получает специальный подтвержденный значок и т.д. Спасибо!

  • 0
    возможный дубликат stackoverflow.com/questions/39161168/… и stackoverflow.com/questions/36714522/…
  • 1
    Как я понимаю из вашего вопроса, вы пытаетесь выяснить общие ценности. Правильно? Если да, создайте два набора из заданных двух массивов и найдите их пересечение. Множество пересечений вернет массив. например, let fruitsSet = Set (firstArray) let vegSet = Set (secondArray) let output = Array (fruitsSet.intersect (vegSet))
Теги:
arrays

5 ответов

2

Что-то вроде этого, что вы после?

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]

var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

for user in usersInData {
    if verifiedUsers.contains(where: { $0 == user } )
        print("\(user) is a special user")
    } else {
        print("\(user) is a regular user")
    }
}
1

Я не совсем уверен, что вы ищете здесь.

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

Если вы хотите знать, имеют ли verifiedUsers и usersInData какие-либо общие элементы.

if !Set(verifiedUsers).isDisjoint(with: usersInData) {
    print("special user")
} else {
    print("regular user") 
}

Если вы хотите знать, есть ли каждый элемент в verifiedUsers в usersInData

if Set(verifiedUsers).isSubset(of: usersInData) {
    print("special user")
} else {
    print("regular user") 
}

или же

if Set(usersInData).isSuperset(of: verifiedUsers) {
    print("special user")
} else {
    print("regular user") 
}

Если вы хотите знать, содержит ли usersInData подпоследовательность verifiedUsers, то это немного обман.

for i in usersInData.startIndex ..< usersInData.endIndex - verifiedUsers.count {
    if verifiedUsers.elementsEqual(usersInData[i ..< i + verifiedUsers.count]) {
        print("special user")
        break
    }
}

Я уверен, что есть лучший ответ на проблему подпоследовательности.

ОБНОВИТЬ

Вдохновленный API @iLandes, я добавил завернутый мой тест подпоследовательности.

extension Array where Element: Equatable {
    func hasSubsequence(_ other: Array) -> Bool {
        for i in startIndex ..< endIndex - other.count {
            if other.elementsEqual(self[i ..< i + other.count]) {
                return true
            }
        }

        return false
    }
}

if usersInData.hasSubsequence(verifiedUsers) {
    print("special user")
} else {
    print("regular user") 
}
0
var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
    var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]

    for user in usersInData {
        if verifiedUsers.contains(user){
        print("\(user) is a special user")
    } else {
        print("\(user) is a regular user")
    }
    }

попробуй это. он будет работать

0

Я понимаю, что вы хотите знать, какое значение присутствует в обоих массивах.

Мы можем использовать Sets для их поиска, как известно из теории множеств в математике.

То, что вы ищете, называется Intersection - элемент находится в обоих наборах элементов. Математические обозначения: A ∩ B

let usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
let verifiedUsers = ["hello", "hello1", "hello2", "hello3", "hello1212"]
let verifiedUsersInData = Array(Set(usersInData).intersection(verifiedUsers))
print(verifiedUsersInData)

выход:

["hello3", "hello", "hello2", "hello1"]

Как вы можете, массив результатов имеет другой порядок, чем два входных массива. Это связано с тем, что у наборов нет концепции упорядочения.

если для вас важно поддерживать порядок, у вас есть несколько вариантов:

  • сортируйте массив результатов, сравнивая порядок с одним из входных массивов,
  • оберните значения во входных массивах в тип, который имеет значение веса, закажите массив результатов им, чем разверните,
  • используйте NSOrderedSet, который сохраняет порядок, но не работает для быстрых типов,
  • найти упорядоченную реализацию набора онлайн. У меня нет никаких рекомендаций ни для кого, но вы должны выбрать тот, который обещает иметь те же характеристики BigO, которые мы используем из наборов.
0

Вы должны использовать contains: func содержит (_ element: String) → Bool. К сожалению, реализация по умолчанию этой функции сравнивает только один элемент.

Вы должны расширить Array и создать func containsArray (array: [Element]) → Bool.

Позвольте сделать это:

extension Array where Element: Equatable {
    func containsArray(array: [Element]) -> Bool {
        return !array.contains { !self.contains($0) }
    }
}

Как использовать его в вашем коде:

var usersInData = ["hello", "hello1", "hello2", "hello3", "hello4", "hello5", "hello6", "hello7"]
var verifiedUsers = ["hello", "hello1", "hello2", "hello3"]


if usersInData.containsArray(array: verifiedUsers) {
    print("Special user")
} else {

    print("Regular user")
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню