JAVA Map返回未触发的密钥和排序

时间:2018-01-31 17:55:09

标签: java sorting dictionary key

我在餐馆课上

...
private Map<String, Race> races = new HashMap<>(); 
private List<Party> parties = new LinkedList<>();

public Map<Race, Integer> statComposition() {
    return parties.stream().flatMap(p->p.getComp().entrySet().stream()) 
            .collect(toMap(e->e.getKey(), e->e.getValue(), (s,a)->s + a));
...

在派对上有

...
private Map<Race, Integer> comp = new HashMap<>();

public void addCompanions(Race race, int num) {
    if(!races.containsKey(race)) {
        races.put(race, num);
    }else{
        races.put(race, races.get(race) + num);
        }
}

public Map<Race, Integer> getComp() {return comps;} 
...

该值均表示伴侣数

但是当我运行主类时,statComposition会返回类似

的内容
{it.polito.oop.milliways.Race@15db9742 = 3, it.polito.oop.milliways.Race@6d06d69c = 2}

其中it.polito.oop.milliways是包名,正确的应该是

{Amoeboid Zingatularians=3, Betelgeusians=2}

为什么会这样?

抱歉标题不好,我真的不知道怎么形容这个。

在这种情况下,如何按键对地图statComposition进行排序?

1 个答案:

答案 0 :(得分:0)

如果您说e->e.getKey(),则会收到Race个对象。当您尝试打印ObjectRace与Java中的所有非主要内容一样)时,它会打印该对象的toString()实现。默认toString()实现在Object中定义(作为完整的类名以及十六进制对象标识符;您正在查看的内容)。如果您没有覆盖对象的toString(),则使用此默认值。你可以从这里选择:

1 :覆盖toString()中的Race

public class X extends Race {
    ...
    @Override
    public String toString() {
        return "X-Name";  // Or, if directly in race, the variable containing the name.
    }
}

2 :调用定义比赛名称的相应方法。 IE:如果该方法是getName()

public Map<String, Integer> statComposition() {
    return parties.stream().flatMap(p->p.getComp().entrySet().stream()) 
            .collect(toMap(e->e.getKey().getName(), e->e.getValue(), (s,a)->s + a));

请注意,除非比赛的唯一定义属性是其名称,否则选项1不是一个好选择。在大多数情况下,我可能会优先考虑选项2。