我在这里看到了很多关于如何使用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(字符串名称,字符串饮料)。然后我将所有人员放入ArrayList。之后,我创建了HashMap,如果键不存在,我想在那里添加一个新的Person,如果键已经存在,则增加到1。
Map<Person, Integer> map = new HashMap<Person, Integer>();
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
所以,据我所知,这应该是另一个技巧。也许你也可以告诉我如何计算饮料的杯子而不是使用哈希图的任何其他想法?非常感谢!
覆盖Person类中的hashcode和equals方法
如果你可以使用Java8个流,这里有一个巧妙的解决方案:
List<Person> 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<Person, Long> 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<Person, Long> map = people
.stream()
.collect(groupingBy(identity(), counting()));
您将Person
Object存储为Key是错误的。
您必须将人名、字符串存储为Key,它会正常工作。
Map<String, Integer> map = new HashMap<>();
for (Person p : persons)
{
if (map.containsKey(p.getName())) {
map.put(p.getName(), map.get(p)+1);
} else {
map.put(p.getName(),1);
}
}