2017-03-15 40 views
5

Edycja: istnieje już pytanie podobne do tego, ale dotyczy liczb oddzielonych konkretnym znakiem (Get no. Of words in swift for average calculator). Zamiast tego pytanie to polega na uzyskaniu liczby rzeczywistych słów w tekście, podzielonych na różne sposoby: podział linii, kilka linii podziału, przestrzeń, więcej niż przestrzeń itd.Jak uzyskać liczbę rzeczywistych słów w tekście w Swift

Chciałbym uzyskać liczbę słowa w ciągu znaków z Swift 3.

Używam tego kodu, ale otrzymuję nieprecyzyjny wynik, ponieważ liczba jest liczona jako spacje i nowe linie zamiast efektywnej liczby słów.

let str = "Architects and city planners,are \ndesigning buildings to create a better quality of life in our urban areas." 
// 18 words, 21 spaces, 2 lines 

let components = str.components(separatedBy: .whitespacesAndNewlines) 

let a = components.count 

print(a) 
// 23 instead of 18 
+0

@LeoDabus Przed udzieleniem odpowiedzi na to pytanie nie widziałem pytania, które łączyłeś lub odpowiedzi, ale odpowiedź wydaje się być zarówno doskonałym dopasowaniem, jak i poprawną odpowiedzią na * to * pytanie. To powiedziawszy, podczas gdy odpowiedzi są mniej więcej identyczne, zarówno tytuł, jak i tekst pytania są tak różne, myślę, że trudno byłoby znaleźć pytanie, które łączyłeś pod tym hasłem. W związku z tym uważam, że jest to odcinek, aby nazwać to pytanie duplikatem. – par

+0

@LeoDabus Wyjaśniłem, jak to pytanie jest inne – Cue

Odpowiedz

9

Kolejne przestrzenie i nowe linie nie złączyły w jedną rodzajowe regionu spacją, więc jesteś po prostu się kilka pustych „słów” między kolejnymi znakami spacji. Pozbyć się tego poprzez odfiltrowanie pustych strun:

let components = str.components(separatedBy: .whitespacesAndNewlines) 
let words = components.filter { !$0.isEmpty } 

print(words.count) // 17 

Powyższe wypisze 17 ponieważ nie zostały uwzględnione , jako znaku oddzielającego, więc ciąg "planners,are" jest traktowany jako jedno słowo.

Można przerwać ten ciąg w górę, jak również dodając znaki interpunkcyjne do zestawu separatorów tak:

let chararacterSet = CharacterSet.whitespacesAndNewlines.union(.punctuationCharacters) 
let components = str.components(separatedBy: chararacterSet) 
let words = components.filter { !$0.isEmpty } 

print(words.count) // 18 

Teraz zobaczysz liczbę 18 jak można się spodziewać.