作者:烨伊华_348 | 来源:互联网 | 2023-01-18 20:11
我在这里看到了很多关于如何使用ArrayList和HashMaps的好解决方案,但重点是我仍然无法解决我的问题.
所以,这个想法是很少有人喝啤酒,葡萄酒和可乐.所以,它看起来像(例如):
Steve wine
Steve cola
Ben cola
Frank wine
Ben cola
Ben cola
Frank wine
最后,我需要计算他们每人喝多少杯饮料.所以,答案应该是这样的:
Steve wine 1
Steve cola 1
Ben cola 3
Frank wine 2
我的想法是创建一个对象Person(String name,String drink).然后我将所有人都放到ArrayList中.之后我创建了HashMap,并希望在键不存在时添加新Person,如果key已存在则增加到1.
Map map = new HashMap();
for (Person p : persons)
{
if (map.containsKey(p)) {
map.put(p, map.get(p)+1);
} else {
map.put(p,1);
}
}
它不起作用.它只返回我的结果:
Steve wine 1
Steve cola 1
Ben cola 1
Frank wine 1
Ben cola 1
Ben cola 1
Frank wine 1
所以,据我所知,这应该是其他一些技巧.也许你还可以告诉任何其他关于如何计算饮料杯数而不是使用HashMap的想法?非常感谢!
1> 小智..:
覆盖Person类中的hashcode和equals方法
2> Petar Petrov..:
如果您可以使用Java 8流,这是一个聪明的解决方案:
List people = Arrays.asList(new Person("Steve", "wine"), new Person("Steve", "cola"),
new Person("Ben", "cola"), new Person("Ben", "cola"), new Person("Steve", "wine"),
new Person("Steve", "wine"));
Map map = people.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
编辑:
要减少代码,您可以静态导入方法,如下所示:
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.counting;
import static java.util.function.Function.identity;
然后代码看起来像这样:
Map map = people
.stream()
.collect(groupingBy(identity(), counting()));