swift 计算单词数组的词频

'''
//
// MainViewController.swift
// Test
//
// Created by Nick on 2020/7/16.
// Copyright © 2020 Nick. All rights reserved.
//

import UIKit

class MainViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = UIColor.white
    
    let car:Goods = Goods.init(name: "BMW X5", price: 100.0)
    car.addCount(count: 33)
    car.reduceCount(count: 4)
    car.showTotalPrice()
    
    let wordAnalysis:WordAnalysis = WordAnalysis.init(fileName: "abs")
    let dict = wordAnalysis.analysisWordFrequency()
    
    let after = dict.sorted { (arg0, arg1) -> Bool in
        if(arg0.value > arg1.value) {
            return false
        }
        return true
    }.reversed()
    
    for (key, value) in after {
        print("单词 \(key) 出现过 \(value) 次")
    }
    
    wordAnalysis.getTheMostCountAppearAdjacentByWord()
}

}

class Goods: NSObject {

var name:String = ""
var price:Double = 0.0
var goodsCount:Int = 0
var totalPrice:Double = 0.0

var cheap_1000:Double = 100.0
var cheap_500:Double = 50.0

init(name:String, price:Double) {
    super.init()
    self.name = name
    self.price = price
}


func addCount(count:Int){
    self.goodsCount += count
}

func reduceCount(count:Int){
    if self.goodsCount >= count {
        self.goodsCount -= count
    }else{
        self.goodsCount = 0
    }
}

func showTotalPrice(){
    let price:Double = Double(self.goodsCount) * self.price
    let cheap_1000_count:Int = Int(price / 1000)
    
    let remainPrice:Double = price - Double(cheap_1000_count) * cheap_1000
    let cheap_500_count:Int = Int(remainPrice / 500)
    
    let cheapPrice:Double = Double(cheap_1000_count)*cheap_1000 + Double(cheap_500_count)*cheap_500
    totalPrice = price - cheapPrice
    
    print("商品:\(self.name) \n数量:\(self.goodsCount) \n原价:\(price)\n优惠金额:\(cheapPrice)\n实收\(totalPrice)")
}

}

class WordAnalysis: NSObject {

var fileName:String = ""

init(fileName:String) {
    super.init()
    self.fileName = fileName
}

//获取文件中的单词数组
func getWordsInFile() -> Array{
    let path = Bundle.main.url(forResource: self.fileName, withExtension: "txt")
    let data = try! Data(contentsOf: path!)
    guard let fileContentString = String(data: data, encoding: .utf8)
        else {
            print("Read file content failed !")
            return []
    }
    
    let letterSet:String = "abcdefghijklmnopqrstuvwxyz "
    
    let filteredCharacters = fileContentString.filter {
        return NSString(string: letterSet).contains(String($0))
    }
    let filteredString = String(filteredCharacters)
    
    let wordArr = filteredString.components(separatedBy: " ").filter { $0.count > 0 }
    return wordArr
    
}

//获取一个单词数组中单词的词频
@discardableResult func analysisWordFrequency() -> Dictionary{
    var wordFrequencyDic:Dictionary = Dictionary.init()
    
    let arr:Array = self.getWordsInFile()
    for word:String in arr {
        let keys = wordFrequencyDic.keys
        if keys.contains(word) {
            wordFrequencyDic[word] =  wordFrequencyDic[word]! + 1
        }else{
            wordFrequencyDic[word] =  1
        }
    }
    return wordFrequencyDic
}

//获取数组中每一个单词相邻的单词中出现次数最多的两个单词
func getTheMostCountAppearAdjacentByWord() {
    
    let arr = self.getWordsInFile()
    let words:Dictionary = self.analysisWordFrequency()
    
    for word in words.keys {
        
        var dict:Dictionary = [:]
        
        for (index, value) in arr.enumerated() {
            if  word == value {
                if index == 0 {
                    let adjacentWord = arr[index + 1]
                    dict = updateWordCountInDictionary(dict: dict, word: adjacentWord)
                }else if index == arr.count - 1 {
                    let adjacentWord = arr[index - 1]
                    dict = updateWordCountInDictionary(dict: dict, word: adjacentWord)
                }else {
                    let adjacentLeftWord = arr[index - 1]
                    dict = updateWordCountInDictionary(dict: dict, word: adjacentLeftWord)
                    let adjacentRightWord = arr[index + 1]
                    dict = updateWordCountInDictionary(dict: dict, word: adjacentRightWord)
                }
            }
        }
        let after = dict.sorted { (arg0, arg1) -> Bool in
            if(arg0.value < arg1.value) {
                return false
            }
            return true
        }
        print("\(word)的相邻单词中\n \(after[0].key):\(after[0].value)次\n \(after[1].key):\(after[1].value)次")
    }
}

func updateWordCountInDictionary(dict:Dictionary, word:String) -> Dictionary {
    var dictionary:Dictionary = dict
    if dictionary.keys.contains(word) {
        dictionary[word] = dictionary[word]! + 1
    }else{
        dictionary[word] = 1
    }
    return dictionary
}

}

'''

你可能感兴趣的:(swift 计算单词数组的词频)