我希望在我的UITextView中找到并按数量排序最多传递3个单词。
例如:
"好的好,非常好的好。不幸的是糟糕的坏事。"
必须这样做:
好(5次) 坏(3次) 非常(2次)我该怎么做? 感谢。
答案 0 :(得分:1)
您可以使用String.components(separatedBy:)
获取textView.text
的字词,然后您可以使用NSCountedSet
来获取每个字词的数量。
您当然可以调整用作components(separatedBy:)
输入的分隔符,以符合您的确切标准。
let textViewText = "good good good very very good good. bad bad unfortunately bad."
//separate the text into words and get rid of the "" results
let words = textViewText.components(separatedBy: [" ","."]).filter({ !$0.isEmpty })
//count the occurrence of each word
let wordCounts = NSCountedSet(array: words)
//sort the words by their counts in a descending order, then take the first three elements
let sortedWords = wordCounts.allObjects.sorted(by: {wordCounts.count(for: $0) > wordCounts.count(for: $1)})[0..<3]
for word in sortedWords {
print("\(word) \(wordCounts.count(for: word))times")
}
输出:
好5次
糟糕的3次
非常2次
答案 1 :(得分:0)
这是一个单行班,按频率顺序为您提供前3个单词:
let words = "good good good very very good good. bad bad unfortunately bad"
let top3words = Set(words.components(separatedBy:" "))
.map{($0,words.components(separatedBy:$0).count-1)}
.sorted{$0.1 > $01.1}[0..<3]
print(top3words) // [("good", 5), ("bad", 3), ("very", 2)]
它创建一个包含每个不同单词的集合,然后将每个单词与字符串中的出现次数(单词)进行映射。最后,它对count上的(word,count)元组进行排序,并返回前3个元素。
[编辑]上述方法的唯一问题是,尽管它适用于您的示例字符串,但它假定其他字中不包含任何字,并且它们仅用空格分隔。
要做好正确的工作,必须首先在数组中隔离单词,消除任何特殊字符(即非字母)。忽略大写和小写也可能是合适的,但你没有指定,我不想增加复杂性。
以下是对单词数组(由相同字符串生成)使用相同方法的方法:
let wordList = words.components(separatedBy:CharacterSet.letters.inverted)
.filter{!$0.isEmpty}
let top3words = Set(wordList)
.map{ word in (word, wordList.filter{$0==word}.count) }
.sorted{$0.1>$1.1}[0..<3]