gpt4 book ai didi

java - 如何在一次迭代中按两个属性对对象列表进行分组?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:41 25 4
gpt4 key购买 nike

我正在尝试根据对象的两个属性对大量对象进行分组。为了证明我的意思,请考虑以下示例。

public class Foo {

private String attributeA;
private String attributeB;
private String anotherAttribute;
}

我想对 Foo 的大列表进行分组按属性分类的对象 attributeAattributeB .目前,我执行以下操作。

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 的情况下获得相同的结果?喜欢Map<Set<String>, List<String>> ?在一次迭代中执行此操作很重要。属性值 attributeAattributeB可以互换。所以使用 Pair作为 Map 的关键也不是一个选项。

最佳答案

如果你想摆脱 Map 作为键,你总是可以编写自己的 Key 来比较两个属性(无论它们的顺序如何)。

public class Key {
private String a;
private String b;
private String c;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Key foo = (Key) o;

if (a.equals(foo.a) || a.equals(foo.b)) {
return true;
}

return b.equals(foo.b) || b.equals(foo.a);
}

@Override
public int hashCode() {
int result = a.hashCode();
result = 31 * result + b.hashCode();
return result;
}
}

关于java - 如何在一次迭代中按两个属性对对象列表进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40789768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com