0

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

有谁知道为什么会发生这种行为,即使我已经添加了 7 个键值对treeMapusing treeMap.put()我发现确实存在的键值对treeMap是最有可能的情绪,但是即使其他属性为0,为什么它们仍然没有被添加到treeMap.

4

2 回答 2

1

发生此错误的原因是因为您使用的 aTreeMap只允许唯一键。这意味着如果有多个情绪有0.0%信心,那么只有最后一个将被存储,因为你的关键TreeMap是 a Double

因此,使用您发布的代码,您只会收到具有不同置信水平百分比的情绪。要解决此问题,您应该做的是切换TreeMap类似的类型:

TreeMap<String, Double> treeMap = new TreeMap<>();

现在,如果要按TreeMap值排序Double,而不是键,则必须使用 a Comparator。你可以在这里找到一个关于如何做到这一点的好解决方案。

基本上,该解决方案所做的是获取Map传入的值,列出值,对值进行排序,然后返回排序后的Map. 我希望这回答了你的问题!

于 2019-01-27T17:44:34.980 回答
0

发生这种情况的原因是我使用的是TreeMap不允许重复键的。因此,如果多个情绪属性返回 0.0,则只保留最近的一个,因为 0.0 是关键。

相反,如果我制作了String(例如“幸福”或“愤怒”),那么TreeMap7 种情绪的值就会包含在内。

于 2018-12-29T04:07:37.590 回答