2016-10-28 3 views
0

Используя Swift, у меня есть массив из примерно 30 строк (каждая строка - это одно слово). У меня также есть переменная строка, и я хочу проверить, имеет ли строка соответствующее значение в массиве.Содержит или для петли, что более эффективно?

Мой вопрос, с точки зрения эффективности, я должен просто использовать:

if myArray.contains("MyString") { 
    //Do stuff 
} 

Или я должен цикл через него?

for i in 0..<myArray.count { 
    if myArray[i] == "MyString" { 
     //Do stuff 
    } 
} 
+1

'myArray.contains()' перечисляет массив также, но останавливается при первом вхождении данного элемента. –

+4

Вы должны спросить себя: имеет ли это значение? Это проверка узкого места производительности для приложения? Если ответ «да», используйте инструменты и измерить. Если ответ «нет», выберите то, с чем вам комфортнее. –

+0

@MartinR сделаю, спасибо! –

ответ

2

С точки зрения эффективности это более эффективно использовать myArray.contains("myString"), так как он остановится, как только она достигнет значения, равного «туЗЬптд», если она действительно существует в массиве на всех. A for-loop будет продолжать все значения даже после того, как он найдет указанное вами значение, поэтому он менее эффективен, но, вероятно, предлагает лишь незначительное повышение эффективности.

Как @vadian сказал, что есть третий способ. Существует также 4-й способ, используя while-loop, который вы можете сделать остановкой после того, как найденное значение найдено, однако использование .contains(...) является более читабельным и кратким и, следовательно, на мой взгляд, это лучший выбор.

+4

Вы также можете остановить цикл 'for' с утверждением' break'. – vadian

2

Это то, что читаемость кода важнее производительности. Разница в for-loop и a contains будет довольно незаметной, если у вас нет действительно огромного массива, который вы используете. По-моему, вы должны пойти с содержит.

0

Если вы действительно заботитесь о производительности, и у вас есть большой набор данных, HashSet или Swift, просто Set даст вам O (1) время поиска для звонка содержит. Поэтому использование лучшей структуры данных будет иметь огромное влияние на производительность здесь, в то время как детали реализации использования цикла или функции contains будут нефакторными.

Set([1, 2, 3, 4, 5]).contains(3) //O(1) 

[1, 2, 3, 4, 5].contains(3) //O(log n) assuming a binary search