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());
}
}
Если вам нужно вернуть HashMap
затем вы можете построить его из Multiset
следующим образом:
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));
}
Мультисеты и мультикарты - некоторые из моих любимых структур данных.Так удобно!