按多个参数对列表中的对象进行分组

时间:2012-01-23 15:47:18

标签: java list grouping

我有一个实体需要按其三个属性进行多次分组,这样可以从左到右进行更精细的选择。假设我有这个课程:

public class Person {
    private String gender;
    private String state;
    private String age;
}

每个属性可以多次保持相同的值,我想相应地对它们进行分组。所以最后我有以下数据结构:

m --> France  --> 20 --> Person1
                         Person2
                  21 --> Person3
                         Person4
      Germany --> 20 --> Person5
                         ...

我希望你明白这个主意。目前,我使用深层嵌套的Map构造来实现此目的:Map<String, Map<String, Map<String, Person>>>

然后我在这个答案中检查现有的密钥:Group by field name in Java对于每个级别的Map,最后将我的对象添加到“最深的”地图。

虽然尚未测试,但应该可以使用,但有没有更好的方法呢?与更易读更快执行

一样

由于它只有一个for循环,执行时间应该是 O(n),这是非常好的,但是,这似乎不是最好的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以实现自定义Comparator,仅比较您需要的属性和跳过其他属性。然后,您可以使用Collections.sort(list, comparator)方法对对象进行排序

答案 1 :(得分:0)

如果您不需要层次结构,则可以使用列表并按标准的相反顺序对其进行3次排序。例如。你想要按州,年龄和性别排序,那么你需要先按性别排序,然后按年龄再按国家排序。

确保排序算法稳定,以便不改变等值条目的排序顺序。

如果使用Map,最好使用更明确的类型然后使用String。年龄应为整数类型,性别为枚举。状态可以是枚举或字符串,具体取决于您拥有多少以及您希望投入多少精力。