Я думаю, что вам, возможно, придется написать отдельную структуру данных (в зависимости от ваших требований к эффективности).
Что-то вроде двусвязного списка с дополнительным nextEqualItemPtr в нем и HashMap, указывающим на первый из каждого элемента.
Затем вы можете быстро найти первый «b» для удаления и следовать всем nextEqualItemPtrs, чтобы удалить их всех (двойные ссылки, так что легко сохранить список в целости).
Накладные расходы на самом деле держать карту в актуальном состоянии. Список nextEqualItemPtr нового элемента может просто указывать на узел, возвращаемый map.put (key) .nextEqualItemPtr
Сначала я определенно использовал бы что-то простое и включал бы такие вещи, только если / когда это слишком медленно.