swift 2集合,用于按值对键值对进行排序

时间:2016-07-21 03:44:02

标签: swift sorting dictionary nsarray

我正在使用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]]
                    ]

我需要对值进行排序,因为最大的浮点数将决定情绪,因此我必须保持键以了解映射的情绪是什么。什么是最好的集合来做到这一点,我已经知道字典并不意味着排序。

1 个答案:

答案 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的值。