我在餐馆课上
...
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
进行排序?
答案 0 :(得分:0)
如果您说e->e.getKey()
,则会收到Race
个对象。当您尝试打印Object
(Race
与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。