获取元素而不进行迭代

时间:2013-05-04 08:52:17

标签: java arraylist hashmap

我有一个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,我希望获得父亲姓名,母亲姓名和子女姓名,而无需重复个别项目。

3 个答案:

答案 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,但这不仅意味着搜索有效的主键,还可能存在问题。哈希的大小。

相关问题