我正在使用Microsoft Face API来检测Android中的面孔和情绪。我有一个TreeMap
,其键是情感属性的概率,值是属性名称,如下所示:
TreeMap<Double, String> treeMap = new TreeMap<>();
treeMap.put(person.faceAttributes.emotion.happiness, "Happiness");
treeMap.put(person.faceAttributes.emotion.anger, "Anger");
treeMap.put(person.faceAttributes.emotion.disgust, "Disgust");
treeMap.put(person.faceAttributes.emotion.sadness, "Sadness");
treeMap.put(person.faceAttributes.emotion.neutral, "Neutral");
treeMap.put(person.faceAttributes.emotion.surprise, "Surprise");
treeMap.put(person.faceAttributes.emotion.fear, "Fear");
(人是Face
类型的对象)
我想要做的是将这7种情绪从最有可能发生到最不可能发生,但是问题是 treeMap
的大小不同。例如,当我选择获取微笑的脸部的情感属性时,treeMap.size()
返回 2 。当我选择获取主要为中性的脸部的情感属性时,treeMap.size()
返回 3 。
即使我使用treeMap
向treeMap.put()
添加了7个键值对,有人知道为什么会发生这种现象吗?我发现treeMap
中存在 do 的键值对是最有可能出现的情绪,但是即使其他属性为0,为什么还不添加它们呢?到treeMap
。
答案 0 :(得分:1)
发生此错误的原因是因为您使用的TreeMap
仅允许唯一键。这意味着如果0.0%
的自信中有一种以上的情绪,那么由于您的TreeMap
的关键是Double
,因此只会存储最后一种情绪。
因此,使用您发布的代码,您将仅收到具有不同置信度百分比百分比的情绪。要解决此问题,您应该像这样切换TreeMap
的类型:
TreeMap<String, Double> treeMap = new TreeMap<>();
现在,如果要按TreeMap
而不是键值对Double
进行排序,则必须使用Comparator
。您可以找到有关如何执行此操作的good solution here。
基本上,该解决方案所做的是获取传入的Map
,列出值,对值进行排序,然后返回排序后的Map
。我希望这能回答您的问题!
答案 1 :(得分:0)
发生这种情况的原因是我使用的0
不允许重复的键。因此,如果一个以上的情感属性返回0.0,则仅保留最新的情感属性,因为0.0是关键。
相反,如果我将TreeMap
作为密钥(例如“幸福”或“愤怒”),那么String
将包含所有7种情绪。