我有一个HashMap键值对的ArrayList,看起来像
ArrayList<HashMap<String, String>> myList =
new ArrayList<HashMap<String, String>>();
我知道我可以遍历这些项目并找到匹配项,但这似乎是一项昂贵的任务。有没有其他方法可以在没有迭代的情况下获取元素?
My ArrayList的值类似于
[{Father Name=a, Mother Name=b, Child Name=c, Reg No=1, Tag ID=1},
{Father Name=p, Mother Name=q, Child Name=r, Reg No=2, Tag ID=2},
{Father Name=x, Mother Name=y, Child Name=z, Reg No=3, Tag ID=3}]
基于RegNo,我希望获得父亲姓名,母亲姓名和子女姓名,而无需重复个别项目。
答案 0 :(得分:1)
如果不进行迭代,则需要将HashMap存储在另一个带有键Reg No
的HashMap中。虽然我建议使用Family
对象或类似的东西:HashMap<Integer, Family> registration
(这就是OO语言之美:) :)
class Family {
String father;
String mother;
String child;
// constructor getters setters
}
Map<Integer, Family> registration = new HashMap(); // note this is a JDK7 future
//Map<Integer, Family> registration = new HashMap<Integer, Family>(); // the 'old' way
registration.put(regNo, new Family("Jack", "Mary", "Bastard"));
Family family = registration.get(regNo);
String father = family.getFather();
答案 1 :(得分:0)
因为您在列表中存储哈希值,这意味着订单保持不变。这意味着您可以创建另一个数组来以相同的顺序存储Reg No,然后在该数组中搜索reg no,并根据搜索的值索引获取其他值。
答案 2 :(得分:0)
迭代是O(n),但是你希望对你的结构的访问更快......这意味着以有序的方式存储对象(通常是&gt; O(log(n))或使用另一个哈希( - &gt; O(1))。
或者这个,或者你“隐藏”迭代,但这只能在美学上解决问题(类似于xml中的getElementsByTagName)。
在任何情况下,您可能都必须改变您的结构,特别是如果您希望能够更快地访问每个字段(父亲/母亲/孩子/标签)而不仅仅是'注意不'。
也许另一种解决方案可能是将普通数据存储在哈希中,并使用密钥对(主键,数据),为HashMap中的每个字段复制PK,但这不仅意味着搜索有效的主键,还可能存在问题。哈希的大小。