java list 多个字段_java – 按多个字段对列表中的对象进行分组

我有一个像这样的简单对象

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

用图表来了解更多

EP70R.png

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


版权声明:本文为weixin_39520988原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。