2013-05-04 135 views
3

我有HashMap的键值对的ArrayList,它看起来像获取元素不反复

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

我明白,我可以通过这些项目迭代,并找到一个匹配,但是这似乎是一个昂贵的任务。有没有其他方法可以不迭代地获取元素?

我的ArrayList具有基于REGNO像

[{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}] 

价值观,我希望得到父亲姓名,母亲姓名及儿童名称不反复的各个项目。

+0

这是哪种编程语言? – 2013-05-04 08:53:23

+0

如果您想通过RegNo访问,您可以使用地图而不是列表。 – Thilo 2013-05-04 08:53:30

回答

0

由于您在列表中存储散列,这意味着顺序保持不变。因此,这意味着您可以创建另一个数组以存储注册号的顺序,然后在该数组中搜索注册号,并根据搜索值索引获取其他值。

1

没有迭代,你需要将你的HashMap存储在另一个带有密钥Reg No的HashMap中。虽然我会建议使用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(); 
0

迭代是O(n),但你想访问你的结构要快...这意味着以有序方式( - > O(log(n)))或使用另一个散列( - > O(1))存储对象。
或者这个,或者你“隐藏”迭代,但是这只会在美学上解决问题(类似于XML中的getElementsByTagName)。

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