2016-12-19 2 views
4

давайте рассмотрим массив:swift - как проверить, содержит ли массив n-й раз строку?

var myArray = ["a", "b", "c", "a", "b", "a", "b", "c", "a", "b"] 

Я знаю, что вам нужно использовать .Contains(), чтобы знать, если массив содержит Objet. myArray.contains("a") //true

Но как узнать, содержит ли массив 4 раза «a»?

+4

myArray.filter {$ 0 == "a"}. Count chck сделал это сработало для вас –

+1

@ShobhakarTiwari Пожалуйста, сделайте это ответом. – dasdom

+0

@ l.b.dev i добавлен как ответ, сделайте правильный ответ –

ответ

5

В Swift это можно найти с помощью всего одной строки коды:

myArray.filter{$0 == "a"}.count 

Надеется, что это помогает. Наслаждайтесь кодированием

0

При решении таких проблем обычно я использую filter для создания нового массива только с элементами «a», а затем просто вызываем count на новый массив.

let count = myArray.filter({$0 == "a"}).count 
print("The element 'a' occurs \(count) times") 
1

Вы можете использовать NSCountedSet.

Обзор

Каждый отдельный объект вставляется в объект NSCountedSet имеет счетчик, связанный с ним. NSCountedSet отслеживает количество вставленных объектов и требует, чтобы объекты удалялись одинаковое количество раз. Таким образом, существует только один экземпляр объекта в объекте NSSet, даже если объект был добавлен к множеству несколько раз. Метод подсчета, определенный суперклассом NSSet, имеет особое значение; он возвращает количество различных объектов, а не общее количество раз, когда объекты представлены в наборе. Классы NSSet и NSMutableSet предоставляются для статических и динамических наборов, соответственно, элементы которых различны.

Хотя NSCountedSet и CFBag не являются бесплатными, они обеспечивают аналогичную функциональность. Для получения дополнительной информации о CFBag см. CFBag.

let countedSet = NSCountedSet(array: myArray) 
let countOfA = countedSet.count(for: "a") // returns 4 

Будучи необщего Objective тип C будет удалить тип, хотя, так что используйте его с осторожностью.

+1

Это лучшее решение, чем принятое, для случаев, когда несколько строк будут запрашиваться из того же массива – Alexander

5

Решение filter, показанное в других ответах, является опрятным и подходит для этой цели. Я включу еще несколько альтернатив.


В качестве другой альтернативы, использовать простой for ... in петлю с where состоянии держит условное увеличение счетчика:

let myArray = ["a", "b", "c", "a", "b", "a", "b", "c", "a", "b"] 
var count = 0 
for element in myArray where element == "a" { count += 1 } 
print(count) //4 

Или, как другой альтернативы, использовать reduce:

let myArray = ["a", "b", "c", "a", "b", "a", "b", "c", "a", "b"] 
let count = myArray.reduce(0) { $0 + ($1 == "a" ? 1 : 0) } 
print(count) //4 

Я также включу пример использования для NSCounted, установленный в @user28434's answer

import Foundation 
let myArray = ["a", "b", "c", "a", "b", "a", "b", "c", "a", "b"] 
let countedSet = NSCountedSet(array: myArray) 
let count = countedSet.count(for: "a") 
print(count) // 4 

// or, simply 
let count = NSCountedSet(array: myArray).count(for: "a") 
+1

Просто потрясающе: «let count = NSCountedSet (array: myArray) .count (для: "a") " – Shades

Смежные вопросы