我正在使用swift 2来访问微软的情感api。这将返回一个json对象,该对象放置在NSArray然后字典中,如下所示:
`let info : NSArray = (json.valueForKey("scores") as? NSArray)!
let anger: Float? = info[0].valueForKey("anger") as? Float
let contempt: Float? = info[0].valueForKey("contempt") as? Float
let disgust: Float? = info[0].valueForKey("disgust") as? Float
let fear: Float? = info[0].valueForKey("fear") as? Float
let happiness: Float? = info[0].valueForKey("happiness") as? Float
let neutral: Float? = info[0].valueForKey("neutral") as? Float
let sadness: Float? = info[0].valueForKey("sadness") as? Float
let surprise: Float? = info[0].valueForKey("surprise") as? Float
emotions.append(anger!)
emotions.append(contempt!)
emotions.append(disgust!)
emotions.append(fear!)
emotions.append(happiness!)
emotions.append(neutral!)
emotions.append(sadness!)
emotions.append(surprise!)
let dictionary = [
"anger" : [emotions[0]],
"contempt" : [emotions[1]],
"disgust" : [emotions[2]],
"fear" : [emotions[3]],
"happiness" : [emotions[4]],
"neutral" : [emotions[5]],
"sadness" : [emotions[6]],
"surprise" : [emotions[7]]
]
我需要对值进行排序,因为最大的浮点数将决定情绪,因此我必须保持键以了解映射的情绪是什么。什么是最好的集合来做到这一点,我已经知道字典并不意味着排序。
答案 0 :(得分:0)
此代码像您一样提取JSON scores
数组的第一个字典,但如果没有任何内容则返回。然后它(1)删除除了你感兴趣的情感键之外的所有元素,(2)将剩余的情感值转换为Float
,并且(3)返回最大值元素的元组。忽略元组的第二个值(情感分数)。
let keys = ["anger", "contempt", "disgust", "fear", "happiness", "neutral", "sadness", "surprise"]
guard let info = (json.valueForKey("scores") as? Array).first else { return }
let (emotion, _) = info
.filter { (k, _) in keys.contains(k) }
.map { (k, v) in (k, Float(v)) }
.maxElement()
现在,您可以根据需要在用户界面中使用emotion
的值。