我有一个像这样的简单对象
public class Person{
private int id;
private int age;
private String hobby;
//getters, setters
}
我想按属性分组Person列表
输出应该是这样的
Person count/Age/Hobby
2/18/Basket
5/20/football
用图表来了解更多
X轴:爱好重新分配
Y轴:人员分布的数量
颜色代表年龄
我设法使用map对一个属性进行分组,但我无法计算如何按多个属性进行分组
//group only by age . I want to group by hobby too
personMapGroupped = new LinkedHashMap>();
for (Person person : listPerson) {
String key = person.getAge();
if (personMapGroupped.get(key) == null) {
personMapGroupped.put(key, new ArrayList());
}
personMapGroupped.get(key).add(person);
}
然后我像这样检索可分组对象
for (Map.Entry> entry : personMapGroupped .entrySet()) {
String key = entry.getKey();// group by age
String value = entry.getValue(); // person count
// i want to retieve the group by hobby here too...
}
任何意见,将不胜感激.
非常感谢你
解决方法:
实现根据不同领域比较人的方法.例如,如果要按年龄分组,请将此方法添加到Person:
public static Comparator getAgeComparator(){
return new Comparator() {
@Override
public int compare(Person o1, Person o2) {
return o1.age-o2.age;
}
};
}
然后你可以简单地调用:Arrays.sort(people,Person.getAgeComparator())或使用以下代码对Collection进行排序:
List people = new ArrayList<>();
people.sort(Person.getAgeComparator());
要同时使用多个比较器进行排序,首先要为每个字段定义一个比较器(例如,一个用于年龄,一个用于名称).然后你可以使用ComparatorChain组合它们.你可以使用ComparatorChain,如下所示:
ComparatorChain chain = new ComparatorChain();
chain.addComparator(Person.getNameComparator());
chain.addComparator(Person.getAgeComparator());
标签:java,dictionary,grouping
来源: https://codeday.me/bug/20190528/1167741.html