我有列表(数组列表),可以包含许多实例(500-3000个实例之间)。 在程序期间,某些功能需要访问此列表(多次)并搜索特定实例或更多,以获取实例需要在列表上循环并提供parentName和name(这是字符串)并且不是唯一的密钥。
我的问题是,因为需要多次访问列表,才能更好地定义/设计,以便更有效地访问列表?
请记住需要从列表中获取实例的函数 无法提供完整密钥,只能提供名称和 parentName ,这些更多一个实例。
List<Obj> myList = new ArrayList<Obj>();
class obj
{
parentName
Name
type
curr
....
答案 0 :(得分:3)
使用Map<MyEntry, List<Obj>>
其中MyEntry
是一个包含父名称和名称的类:
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
对象的方法。此外,如果您使用番石榴,请查看MultiMap
。
您会注意到哈希代码是预先计算的:这可以完成,因为MyEntry
类是不可变的。这允许非常快速地用作Map
的密钥。
(编辑:已添加.toString()
)