0

我有可以包含许多实例(500-3000 个实例之间)的列表(数组列表)。在程序期间,某些功能需要访问此列表(多次)并搜索特定实例或更多,以获取他们需要在列表中循环并提供 parentName 和名称(这是字符串)并且不是唯一键的实例.

我的问题是,由于需要多次访问列表,因此有一种方法可以更好地定义/设计它,以便更有效地访问列表?

请记住,需要从列表中获取实例的函数不能提供完整的密钥,只能提供名称parentName,它们可以有多个实例。

List<Obj>   myList = new ArrayList<Obj>();

class obj
{
parentName
Name
type 
curr
....
4

1 回答 1

3

使用Map<MyEntry, List<Obj>>whereMyEntry是一个包含父名称和名称的类:

public final class MyEntry
{
    private final String parentName;
    private final String name;
    private final int hashCode;

    public MyEntry(final String parentName, final String name)
    {
        this.parentName = parentName;
        this.name = name;
        hashCode = 31 * parentName.hashCode() + name.hashCode();
    }

    // Override .equals() and .hashCode()
    @Override
    public int hashCode()
    {
        return hashCode;
    }

    @Override
    public boolean equals(final Object o)
    {
        if (this == o)
            return true;
        if (o == null)
            return false;
        if (getClass() != o.getClass())
            return false;
        final MyEntry other = (MyEntry) o;
        return parentName.equals(other.parentName)
            && name.equals(other.name);
    }

    // Have a nice string representation
    @Override
    public String toString()
    {
        return "parent name: " + parentName + ", name: " + name;
    }
}

例如,您可以在您的方法中有一个Obj返回匹配MyEntry对象的方法。此外,如果您使用 Guava,请查看MultiMap.

您会注意到哈希码是预先计算的:因为MyEntry类是不可变的,所以可以这样做。这允许非常快速地用作Map.

(编辑:添加.toString()

于 2012-12-22T11:06:03.507 回答