【问题标题】:Hashmap implemented as a family tree with linked list JavaHashmap 实现为带有链表 Java 的家谱
【发布时间】:2022-01-25 15:27:39
【问题描述】:

我有一个关于 Hashmap 的问题,该 Hashmap 被实现为看起来像这样的家谱。 Hashmap 的键值是人的名字,值来自 Person 类,该类再次包含名字、性别和带有孩子的 Arraylist。孩子们又是典型的人。 我想找到一种方法来制作一个函数,它应该返回一个包含两个字段的浮点数组,在第一个字段中,一个人从所有人中拥有的孩子的最大值和所有人的孩子的平均值。应该是这样的:

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

这是 Hashmap:(已经填充了键和值,并且它们与子项之间也有链接)

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

这是Person类:

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 并获得每个人拥有的孩子的数量。

【问题讨论】:

  • “一个人从所有人中最多可以拥有多少个孩子”——你关心孙辈的数量吗?如果是,那就是 DFS 遍历。

标签: java arraylist hashmap family-tree


【解决方案1】:

根据Personchildren 列表的大小,使用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;
}

【讨论】:

  • 哦,非常感谢您的快速回答! :) 遗憾的是,我不允许使用例如 IntSummaryStatistics 等,所以我发现了如何遍历列表并获取每个人的孩子的数量,如下所示:(allPersons 是哈希图名称的占位符): for (Map.Entry entry: allPersons.entrySet()) { System.out.println(entry.getValue().children.size()); } 这给了我每个人的孩子。现在我想把它们保存在一个浮点数组中,以便之后用它来完成任务。你现在,我该怎么做?可爱的问候!
  • @ChrisiS,你可以查看更新
【解决方案2】:

如果你不关心孙辈的大小,你可以使用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()};

【讨论】:

  • 哦,非常感谢您的快速回答! :) 遗憾的是,我不允许使用例如 IntSummaryStatistics 等,所以我发现了如何遍历列表并获取每个人的孩子的数量,如下所示:(allPersons 是哈希图名称的占位符): for (Map.Entry entry: allPersons.entrySet()) { System.out.println(entry.getValue().children.size()); } 这给了我每个人的孩子。现在我想把它们保存在一个浮点数组中,以便之后用它来完成任务。你现在,我该怎么做?可爱的问候!
  • 更新了我的答案。
  • 非常感谢!很高兴你能帮忙:)!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
相关资源
最近更新 更多