我尝试按照两个属性对一个大列表的对象进行分组。为了说明我的意思,请考虑以下示例。
public class Foo {
private String attributeA;
private String attributeB;
private String anotherAttribute;
}
我希望能够按照attributeA
和attributeB
这两个属性对大量的Foo
对象进行分组。目前我的做法如下。
List<Foo> foos = getFoos();
Map<Set<String>, List<String>> groupedFoos = Sets.newHashMap();
Set<String> fooGroup;
for(Foo foo : foos) {
fooGroup = Sets.newHashMap(foo.getAttributeA(), foo.getAttributeB());
if (!groupedFoos.containsKey(fooGroup)) {
groupedFoos.put(fooGroup, Lists.newArrayList(foo));
} else {
groupedFoos.get(fooGroup).add(foo);
}
}
如何在不使用像Map<Set<String>, List<String>>
这样的映射的情况下实现相同的结果?重要的是在一次迭代中完成。属性attributeA
和attributeB
的值可以互换。因此,使用Pair
作为Map
的键也不是选择。
Foo.hashCode
,为什么不实现对两个属性进行排序组合的哈希,并将其用作映射键呢?或者只需像您一样使用Sets.newHashMap()
,但事先对属性进行排序即可。 - Xavi López