bristophocles
bristophocles

Reputation: 143

Java storage and lookup of HashMap in HashSet

I have a set with multi-dimensional hashmaps, like so:

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

I am having trouble removing a HashMap entry. I know the key for the top level hashmap, but do not know any data in the underlying hashmap. I am trying to remove a hashmap entry in the set in these ways:

I.

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

... Add some hashmaps to the set, then ...

String myKey = "target_key";
setInQuestion.remove(myKey);

II.

Set<HashMap<String, HashMap<String, String>>> myHashSet = new HashSet<HashMap<String, HashMap<String, String>>>();

... Add some hashmaps to the set, then ...

String myKey = "key_one"; //Assume a hashmap has been added with this top level key
HashMap<String, HashMap<String, String>> removeMap = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> dummyMap = new HashMap<String, String>();
removeMap.put(myKey, dummyMap);
setInQuestion.remove(removeMap);

Neither of these methods work. How would I go about removing an entry in the set if I only know the top level hashmap's key?

Upvotes: 1

Views: 336

Answers (3)

slavemaster
slavemaster

Reputation: 204

Sorry I couldn't post this as a comment. I wanted to point out that @jtahlborn's point about Map equality is a well-defined part of the contract... see Map.equals.

... two maps m1 and m2 represent the same mappings if m1.entrySet().equals(m2.entrySet()). This ensures that the equals method works properly across different implementations of the Map interface.

Map.Entry.equals is worded similarly.

... two entries e1 and e2 represent the same mapping if

     (e1.getKey()==null ?
       e2.getKey()==null : e1.getKey().equals(e2.getKey()))  &&
      (e1.getValue()==null ?
       e2.getValue()==null : e1.getValue().equals(e2.getValue()))

This ensures that the equals method works properly across different implementations of the Map.Entry interface.

Upvotes: 0

bristophocles
bristophocles

Reputation: 143

Thanks jtahlborn for the guidance. Wanted to post the solution I've found as a result of your answer:

String myKey = "Key_In_Question";
Iterator mySetIterator = myHashSet.iterator();
while(mySetIterator.hasNext()) {
    HashMap<String, HashMap<String, String>> entry = (HashMap<String, HashMap<String, String>>) mySetIterator.next();
    if(entry.containsKey(myKey)) {
        myHashSet.remove(entry);
    }
}

Upvotes: 0

jtahlborn
jtahlborn

Reputation: 53694

Collection.remove() requires object equality. the various jdk Map implementations implement equality to mean all keys/values must match. Since none of the objects you are passing to the remove() call would be "equal" to any of the Maps in the Set, nothing is being removed.

the only way to do what you want is to iterate through the Set yourself to find the matching Map (or, make the Set into a Map keyed on that special key).

Upvotes: 2

Related Questions