3

我有一个 HashMap 键值对的 ArrayList,它看起来像

ArrayList<HashMap<String, String>> myList = 
            new ArrayList<HashMap<String, String>>();

我知道我可以遍历这些项目并找到匹配项,但这似乎是一项昂贵的任务。有没有其他方法可以在不迭代的情况下获取元素?

我的 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,我希望在不迭代单个项目的情况下获得父亲姓名、母亲姓名和孩子姓名。

4

3 回答 3

1

如果不进行迭代,您将需要将 HashMap 存储在另一个带有 key 的 HashMap 中Reg No。虽然我建议使用Family对象或类似的东西:(HashMap<Integer, Family> registration这就是面向对象语言的美妙之处:))

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();
于 2013-05-04T08:55:46.020 回答
0

迭代是 O(n),但您希望更快地访问您的结构...这意味着以有序的方式存储对象(通常 -> O(log(n)))或使用另一个哈希( -> O( 1))。
或者这个,或者你“隐藏”迭代,但这只会从美学上解决问题(类似于xml中的getElementsByTagName)。

在任何情况下,您可能都必须更改您的结构,特别是如果您希望能够更快地访问每个字段(父亲/母亲/孩子/标签),而不仅仅是“reg no”。
也许另一种解决方案可能是将普通数据存储在带有(主键,数据)之类的密钥对的哈希中,为 HashMap 中的每个字段复制 PK,但这不仅意味着搜索有效的主键,还可能存在哈希的大小。

于 2013-05-04T09:16:39.697 回答
0

由于您将哈希存储在列表中,这意味着顺序保持不变。这意味着您可以创建另一个数组以相同的顺序存储 Reg No,然后在该数组中搜索 reg no 并根据搜索值索引您可以获得其他值。

于 2013-05-04T08:55:24.910 回答