当前位置: 首页 > 知识库问答 >
问题:

有没有一种更有效的方法可以使用ArrayList中的计数器生成HashMap?

东方旺
2023-03-14

我有一个方法,允许我从ArrayList创建HashMap,方法是获取AirbnbList对象,然后将邻里名称与HashMap中的任何键进行比较。如果它还没有在hashmap中,我将它添加为从1开始的计数器,如果它已经存在,我将计数器递增。

有没有更有效的方法可以做到这一点?这是我的代码:

    public HashMap<String, Integer> sortHousesInNbrhood(ArrayList<AirbnbListing> priceRangeListing) {
    HashMap<String, Integer> housesInNbrhood = new HashMap<>();
    for (AirbnbListing listing : priceRangeListing) {
        if (housesInNbrhood.isEmpty()) {
            housesInNbrhood.put(listing.getNeighbourhood(), 1); 
        } else if (housesInNbrhood.containsKey(listing.getNeighbourhood())) {
            housesInNbrhood.replace(listing.getNeighbourhood(), housesInNbrhood.get(listing.getNeighbourhood()) + 1);
        } else {
            housesInNbrhood.put(listing.getNeighbourhood(),1); 
        }
    }

    return housesInNbrhood;
}

共有3个答案

朱高丽
2023-03-14

Multiset是专门用于跟踪对象在集合中出现的次数的数据结构。它们非常适合您的问题!

它们在Java标准库中不可用,但在Guava库中可用。

我建议您将HashMap作为方法的返回值替换为Multiset。如果是这样的话,读者就会更清楚它包含了什么。

使用该解决方案,代码如下所示:

public Multiset<String> sortHousesInNbrhood(List<AirbnbListing> priceRangeListing) {
    Multiset<String> housesInNbrhood = TreeMultiset.create();
    // Multimap automatically counts the number of times an object have been added
    priceRangeListing.forEach(list -> housesInNbrhood.add(list.getNeighbourhood()));
    return housesInNbrhood;
}

// Use the multiset like this:
public void useMultiset(List<AirbnbListing> priceRangeListing) {
    Multiset<String> s = sortHousesInNbrhood(priceRangeListing);
    System.out.println("Houses in Bagdad:" + s.count("Bagdad"));

    System.out.println("All counts: ");
    for (Entry<String> e : s.entrySet()) {
        System.out.println(e.getElement() + ": " + e.getCount());
    }
}

如果必须返回哈希映射,则可以从多集构造它,如下所示:

public Map<String, Integer> sortHousesInNbrhood_2(List<AirbnbListing> priceRangeListing) {
    Multiset<String> housesInNbrhood = TreeMultiset.create();
    priceRangeListing.forEach(list -> housesInNbrhood.add(list.getNeighbourhood()));
    return housesInNbrhood.entrySet().stream().collect(toMap(Entry::getElement, Entry::getCount));
}

多集和多地图是我最喜欢的一些数据结构。太方便了!

蒋权
2023-03-14
public HashMap<String, Integer> sortHousesInNbrhood(ArrayList<AirbnbListing> priceRangeListing) {
    HashMap<String, Integer> housesInNbrhood = new HashMap<>();
    for (AirbnbListing listing : priceRangeListing) {
         housesInNbrhood.compute(listing.getNeighbourhood(), (k, v) -> (v == null) ? 1 : v + 1);
    }

    return housesInNbrhood;
}
仇睿
2023-03-14

使用带有计数的分组依据收集器作为下游收集器:

priceRangeListing.stream()
                 .collect(groupingBy(AirbnbListing::getNeighbourhood, counting()));

注意,上面会产生一个Map

priceRangeListing.stream()
       .collect(groupingBy(AirbnbListing::getNeighbourhood, summingInt(e -> 1)));

 类似资料:
  • 问题内容: Java的UUID类生成随机的UUID。但这由字母和数字组成。对于某些应用,我们只需要数字。有没有一种方法可以生成仅由Java中的数字组成的随机UUID? 问题答案: 如果您不想使用随机数,但是带有数字的UUID仅使用: 在这种情况下,左填充为40个零… 结果为: UUID:b55081fa-9cd1-48c2-95d4-efe2db322a54 in: UUID:0241008287

  • 问题内容: 我有看起来像这样的代码: 它返回一个长度为32的字符串,但我认为它不是有效的UUID。如果它是一个真正的UUID,为什么它是一个UUID,什么是代码,修改的值的目的和。 有没有更好的方法来生成UUID? 问题答案: 这些行将字节6和8的值限制在特定范围内。返回range内的随机字节,这些字节不是UUID的所有有效值。据我所知,这应该对片中的所有值进行。 如果您使用的是Linux,则可以

  • 问题内容: 我正在开发一个新项目(),并创建了一个包含大量变量的Object。由于我打算为所有这些添加吸气剂和设置器,所以我想知道:是否存在在给定类中自动生成吸气剂和设置器的捷径? 问题答案: 在所需类的源代码窗口中弹出上下文菜单(即右键单击)。然后选择子菜单;从该菜单中进行选择将导致出现向导窗口。 选择您要为其创建getter和setter的变量,然后单击。

  • 问题内容: 嗨,我想使用WMI类来查找应用程序和产品信息。但是问题是我想使用Java或任何脚本语言(如python,javascript或perl)。我听说过JWMI,这可能是一个选择。有人可以帮我吗??? 问题答案: JavaScript和Java不是一回事。 JavaScript Windows脚本宿主(WSH)下提供了JavaScript。有了它,访问WMI相当容易: jWMI(Java)

  • 我之前问过这个问题,但是没有得到我想要的答案。经检查,这是我的错,因为我没有明确我的目标是什么,我很抱歉。我正在为一个AP统计类编写代码,我在其中必须生成没有重复的随机数据。TI计算器使用Lua,所以我希望我能制作一个程序,不仅生成数字,还能回答我的问题,只是为了缩短所需的时间。作业的名称是“ESP”为了时间的缘故,我会缩短场景,有两个人,艾米和本,他们在两张索引卡上写上名字,然后把他们的卡片放在