String 如何找到两个单词的常用字母?

String 如何找到两个单词的常用字母?,string,swift,cocoa-touch,String,Swift,Cocoa Touch,我正在用swift编写一个简单的爱情计算器。它的工作原理是取两个人的名字,并将字母数相加。然后它找到共同的字母数,从总数中减去,再除以总数得到概率百分比。例如: 第一人:查尔斯 第二个人:简 查尔斯+简=总共11封信 查尔斯和简有一个A和一个E的共同点,所以从11减去两个E和两个A,我们得到7。7除以11等于63% 我的问题是,找到共同字母的最佳方法是什么? 我对swift相当陌生,但我以前曾与objective C合作过。这是我的密码: // // ViewController.swif

我正在用swift编写一个简单的爱情计算器。它的工作原理是取两个人的名字,并将字母数相加。然后它找到共同的字母数,从总数中减去,再除以总数得到概率百分比。例如:

  • 第一人:查尔斯
  • 第二个人:简

  • 查尔斯+简=总共11封信

  • 查尔斯和简有一个A和一个E的共同点,所以从11减去两个E和两个A,我们得到7。7除以11等于63%
我的问题是,找到共同字母的最佳方法是什么?

我对swift相当陌生,但我以前曾与objective C合作过。这是我的密码:

//
//  ViewController.swift
//  Love Calculator
//
//  Created by Caden Farley on 8/18/15.
//  Copyright (c) 2015 Caden Farley. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    var total = 0
    @IBOutlet var person1: UITextField!
    @IBOutlet var person2: UITextField!
    @IBOutlet var resultText: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func buttonPressed () {
        self.view.endEditing(true)
        let string1 = person1.text
        let string2 = person2.text

        total = count(string1) + count(string1)
        resultText.text = "\(total)"
    }
}

这个问题是重复的,它们是有用的,但是它们都使用了基础方法。

下面是使用
Set
查找纯Swift 2.0中两个单词的常用字母的简单方法:

let person1 = "Charles"
let person2 = "Jane"

let p1Set = Set(person1.lowercaseString.characters)
let p2Set = Set(person2.lowercaseString.characters)

let common = Array(p1Set.intersect(p2Set)).map({ String($0) })

print(common.count)  // 2

for letter in common {
    print(letter)  // "e", "a"
}
Swift 1.2中仅略有不同:

let person1 = "Charles"
let person2 = "Jane"

let p1Set = Set(person1.lowercaseString)
let p2Set = Set(person2.lowercaseString)

let common = Array(p1Set.intersect(p2Set)).map({ String($0) })

println(common.count)  // 2

for letter in common {
    println(letter)  // "e", "a"
}
当然,使用
Set
意味着它只计算唯一的字母,而不计算出现的次数

为此,您必须使用类似于
NSCountedSet
(但已经有这样的示例了)。

func兼容性(a:String,b:String)->Int{
let(aC,bC)=(a.小写字符,b.小写字符)
让matches={(col:String.CharacterView,set:set)在
集合中的列reduce(0){(sum,c)包含(c)?sum+1:sum}
}
让tot=aC.count+bC.count
设com=matches(aC,Set(bC))+matches(bC,Set(aC))
退货(tot-com)*100/tot
}
相容性(“查尔斯”,“简”)//63
func compatability(a: String, _ b: String) -> Int {
  let (aC, bC) = (a.lowercaseString.characters, b.lowercaseString.characters)
  let matches = { (col: String.CharacterView, set: Set<Character>) in
    col.reduce(0) { (sum, c) in set.contains(c) ? sum + 1 : sum }
  }
  let tot = aC.count + bC.count
  let com = matches(aC, Set(bC)) + matches(bC, Set(aC))
  return (tot - com) * 100 / tot
}

compatability("Charles", "Jane") // 63