我有一个“SomeClass”列表,它可能包含很多功能相同的对象,我需要将它们分组。具有相同getName(),getInputDate(),getOutputDate()和getValue()的条目应组合在一起。我遇到了Multimap,这似乎是我需要的,但我无法想出如何将这些分组的优雅方式。
目前我已将它们全部用作Multimap的关键,但我不认为这是最佳解决方案..
private ImmutableListMultimap<String, SomeClass> getGrouped() {
return Multimaps.index
(someClassList, new Function<SomeClass, String>() {
public String apply(SomeClass someClass) {
return someClass.getName() + someClass.getInputDate() + someClass
.getOutputDate() + someClass.getValue();
}
});
}
答案 0 :(得分:5)
代码问题是关键。将值折叠为字符串以获取密钥不是一个好主意。我会创建一个关键对象并使用其余的代码:
public class PersonGroup{
private String name;
private Date input;
private Date output;
private String value;
public PersonGroup(String name, Date input, Date output, String value) {
this.name = name;
this.input = input;
this.output = output;
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PersonGroup that = (PersonGroup) o;
if (input != null ? !input.equals(that.input) : that.input != null) return false;
if (name != null ? !name.equals(that.name) : that.name != null) return false;
if (output != null ? !output.equals(that.output) : that.output != null) return false;
if (value != null ? !value.equals(that.value) : that.value != null) return false;
return true;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (input != null ? input.hashCode() : 0);
result = 31 * result + (output != null ? output.hashCode() : 0);
result = 31 * result + (value != null ? value.hashCode() : 0);
return result;
}
}
将您的代码更新为
private ImmutableListMultimap<PersonGroup, SomeClass> getGrouped() {
return Multimaps.index
(someClassList, new Function<SomeClass, PersonGroup>() {
public PersonGroup apply(SomeClass someClass) {
return new PersonGroup(someClass.getName(), someClass.getInputDate(), someClass
.getOutputDate(), someClass.getValue());
}
});
}