我有一个方法,允许我从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;
}
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));
}
多集和多地图是我最喜欢的一些数据结构。太方便了!
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;
}
使用带有计数的分组依据收集器作为下游收集器:
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”为了时间的缘故,我会缩短场景,有两个人,艾米和本,他们在两张索引卡上写上名字,然后把他们的卡片放在