Jack Greenhill's answer действительно идет в правильном направлении. Однако с большим количеством значений его метод будет очень неэффективным, поскольку он должен проверять каждый элемент массива на равенство, поэтому сложность O(n)
.
Следует использовать очень недооцененную структуру данных, которая может выполнять этот вид операции в O(1)
: Set. Он использует хеш-значения, чтобы быстро проверить, присутствует ли значение или нет. Вы можете использовать его как это:
let x = 3
let values : Set = [1, 3, 6, 1, 7] // {6, 7, 3, 1}
if values.contains(x) {
// ...
}
Это занимает столько же времени, values
содержит ли только один или 1000 элементов. Массив будет в 1000 раз медленнее.
Зачастую решение использовать массив выполняется до того, как он даже рассмотрит набор. Если ваши элементы не имеют какого-либо порядка и могут возникать только один раз (что на самом деле происходит чаще, чем вы думаете), вам, вероятно, нужен набор. Набор дает вам полезные методы, такие как union
, isSubset
, interception
и более, бесплатно, просто поместив в него свои элементы. Единственное дополнительное требование для типа элемента - соответствовать Hashable
.
Какие другие языки, из интереса? – Bathsheba
@ Bathsheba Tbh Я не помню, но я помню, как это делалось, просто не так. – StevoHN
В C, C++ и Java эти две формы разные. – Bathsheba