While coding a utility map class I was struck by this problem: what is the meaning of
remove? That is, what does does it mean to remove a key when the map has more than one value for that key? How could that happen, you ask. My map isn't the ordinary sort: it's a union map, or a view of a list of maps.
Picture a stack of maps like a column of egg cartons over which you stand. As you look down through a particular cell from above, some cartons have an egg there, some do not. My union map is as if you collapsed the stack of egg cartons. Into each cell goes some kind of combination of the eggs from the corresponding cells in the original stack. The usual rule selects the top-most egg; remove just the top-most egg, and the rule selects the next egg down in the stack of cells; if there are no eggs in any cell, the collapsed cell is also lacking.
So I am faced with the question, what does it mean to remove a key from the union map? Do I remove all eggs in the matching cell from all cartons, or do I just remove the top-most one and the cell has a new value? Either way seems to me not quite right. As a practical matter, I chose for
remove to remove all values for the key in all stacked maps so that collectively they would still follow the requirements of
remove in the JDK, and I provided a
removeOne to remove just the top-most value. Linguistically, I'd prefer for
remove to perform this function, and for a
removeAll to remove the key-value pairs from all stacked maps, but that would break expectations.