Hashmap 实现为带链表的家谱 Java

Hashmap implemented as a family tree with linked list Java

我有一个关于 Hashmap 的问题,该 Hashmap 被实现为如下所示的家谱。 Hashmap 的键值是人的名字,值来自 class Person,它再次包含名字、性别和带有 children 的 Arraylist。 children 再次来自 person 类型。 我想找到一种方法来制作一个函数,它应该 return 一个有两个字段的浮点数组,在第一个字段中,一个人从所有人中得到的最大值 children 和 [=22] 的平均值=] 所有人。应如下所示:

float[] describe(Map<String, Person> m) {
}

这是哈希图:(已经填充了键和值,它们和 children 之间还有一个 link)

Map<String, Person> allPersons = new HashMap<String, Person>();

这是class人:

class Person {
    String name;
    String sex;
    List<Person> children;

    public Person(String name, String sex) {
        this.name = name;
        this.sex = sex;
        this.children = new ArrayList<Person>();
    }
}

我的问题是如何遍历 Hashmap 并获得每个人拥有的 children 数量。

对于每个 Person:

children 列表的大小,使用 Stream API 及其 Collectors::summarizingInt 可能很方便
float[] describe(Map<String, Person> m) {
    IntSummaryStatistics stats = m.values()
        .stream() // Stream<Person>
        .collect(Collectors.summarizingInt(p -> p.getChildren().size()));

    return new float[]{ stats.getMax(), (float) stats.getAverage()};
}

如果无法使用 Stream API,可以在一个简单的循环中计算统计数据:

float[] describe(Map<String, Person> m) {
    float[] stats = {0.0f, 0.0f};
    for (Person p : m.values()) {
        int kids = p.getChildren().size();
        stats[0] = Math.max(stats[0], kids);
        stats[1] += kids;
    }
    stats[1] /= Math.max(1, m.values().size());
    return stats;
}

如果你不关心孙子的大小,你可以使用stream with summaryStatistics

Map<String, Person> m = Map.of(...);
IntSummaryStatistics stats = m.values().stream()
        .mapToInt(person -> person.children.size())
        .summaryStatistics();
float[] s = {stats.getMax(), (float) stats.getAverage()};

迭代解:

float max = 0, sum = 0;
for (Person person : m.values()) {
    max = Math.max(person.children.size(), max);
    sum += person.children.size();
}

float[] s = {max, sum / m.values().size()};