Jigskep
Jigskep

Reputation: 111

Get element without iterating

I have an ArrayList of HashMap key-value pairs which looks like

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

I understand that I can iterate through these items and find a match, but this seems to be an expensive task. Is there any other way to get an element without iterating?

My ArrayList has values like

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

Based on RegNo, I wish to get Father Name, Mother Name and Child Name without iterating individual items.

Upvotes: 3

Views: 2358

Answers (3)

lunadir
lunadir

Reputation: 339

Iterating is O(n), but you want the access to your structure to be faster... This means storing objects in a ordered manner ( -> O(log(n)) usually) or using another hash ( -> O(1)).
Or this, or you "hide" the iteration, but this would solve the problem only esthetically (something like getElementsByTagName in xml).

In any case you'll probably have to alter your structures, especially if you want to be able to have faster access for every field (father/mother/child/tag) and not just 'reg no'.
Maybe another solution could be storing plain data in a hash with a keypair like (primary key, data), duplicating the PK for every field in your HashMap, but this not only implies searching a valid primary key, there could be the problem of the size of the hash.

Upvotes: 0

Menno
Menno

Reputation: 12621

Without iterating you will need to store your HashMap in another HashMap with key Reg No. Though I'd recommend using a Family object or something similar: HashMap<Integer, Family> registration (that's the beauty of OO-languages :) )

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();

Upvotes: 1

Aman Agarwal
Aman Agarwal

Reputation: 755

since you are storing hashes in list, that means order remain constant. So that mean you can create another array to store the Reg No in same order, and then search reg no in that array and based on searched value index you can get the other values.

Upvotes: 0

Related Questions