如何根据几个标准索引多图?

时间:2015-06-15 09:15:57

标签: java guava

我有一个“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();
                    }
                });
}

1 个答案:

答案 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());
                    }
                });
    }