从父对象创建子对象的映射

5

我有一个父对象列表,想要统计子对象的出现次数。我知道可以使用 instanceof 运算符来计算每种对象类型的出现次数,如下所示。但是,我想使用 HashMap 而不是 if-else 分支。我尝试创建 Map<? extends Parent, Integer>,但它没有起作用。有什么建议吗?

class Parent {
// parent class
}

class ChildA extends Parent {
 // child class
}

class ChildB extends Parent {
 // child class
}

class ChildC extends Parent{
 // child class
}

int countChildA = 0;
int countChildB = 0;
int countChildC = 0;
for (Parent child : children)
{
    if (child instanceof ChildA)
    {
        countChildA++;
    }
    else if (child instanceof ChildB)
    {
        countChildB++;
    }
    else if (child instanceOf ChildC)
    {
        countChildC++;
    }
}

// what I'm looking for
Map<? extends Parent, Integer> map = new HashMap<>();
for (Parent child : children)
{
    map.put(child, child.getValue(child)++);
}

你想按子类的类型进行分组,而不是按照每个子类:每个子类都是唯一的。因此,你需要一个Map<Class<? extends Parent>, Integer>。 - JB Nizet
1个回答

5

您需要将 Map 的键设置为 ClassParent 实例的类型):

Map<Class<? extends Parent>, Integer> map = new HashMap<>();

而不是:

map.put(child, child.getValue (child)++);

使用:

if (map.containsKey(child.getClass())) {
    map.put(child.getClass(), map.get (child.getClass())+1);
} else {
    map.put(child.getClass(), 1);
}

或者

map.put(child.getClass(), map.getOrDefault(child.getClass(), 0) + 1);

3
对于Java 8及以上版本,使用map.merge(child.getClass(), 1, (a,b) -> a+b);来替代if语句块。 - Jeroen Steenbeeke
1
@JeroenSteenbeeke 我更喜欢使用 Integer::sum 而不是 (a,b) -> a+b - Michael
@Michael 更好! - Jeroen Steenbeeke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接