Если вы связываете категории с продуктами через коллекцию участников, и наоборот, то вы можете сделать то же самое:
public class Product {
private Set<Category> categories = new HashSet<Category>();
//implement hashCode and equals, potentially by id for extra performance
}
public class Category {
private Set<Product> contents = new HashSet<Product>();
//implement hashCode and equals, potentially by id for extra performance
}
Единственная сложная часть - заполнение такой структуры, где некоторые промежуточные карты могут
Но подход к использованию вспомогательных хэш-карт / деревьев для индексации не является плохим.В конце концов, большинство индексов, размещенных, например, в базах данных, являются вспомогательными структурами данных: они сосуществуют с таблицей строк;строки не обязательно организованы в структуре самого индекса.
Использование такой внешней структуры дает вам возможность хранить оптимизации и данные отдельно друг от друга;это не плохоОсобенно, если завтра вы захотите добавить O (1) поиска для продуктов, предоставленных Продавцом, например,
Редактировать: Кстати, похоже, что вы хотитереализация Multimap , оптимизированной также для выполнения обратного поиска в O (1).Я не думаю, что Guava может что-то сделать, но вы могли бы реализовать интерфейс Multimap, чтобы, по крайней мере, вам не приходилось иметь дело с поддержкой HashMaps отдельно. На самом деле это больше похоже на BiMap, который также является Multimap, которыйпротиворечиво, учитывая их определения.Я согласен с MStodd, что вы, вероятно, хотите создать свой собственный слой абстракции для инкапсуляции двух карт.