Я не знаю значения Queue
в этом упражнении (или LinkedList
), так как вы захотите иметь возможность произвольного доступа к зависимостям пакета.
Я бы предложил
Map<String, Set<String>> dependsOn = new HashMap<>();
Map<String, Set<String>> requiredBy = new HashMap<>();
Таким образом, когда вы удаляете пакет, вы можете найти все пакеты, в которые он был извлечен (dependsOn.get(packageToDelete)
), и удалить packageToDelete
из каждой их записи в requiredBy
;если при этом набор requiredBy
остается пустым, этот пакет также можно удалить.
Я бы также предложил использовать Set
для зависимых пакетов, которые будут добавлены при добавлении нового корневого пакета.На самом деле не имеет значения, в каком порядке вы их обрабатываете, и более полезно быть быстрым и избегать дублирования.
Изначально я предполагал, что будет проще - проще кодировать и отлаживать - использовать уникальные полностьюквалифицированные имена пакетов в качестве ключей.Для этого требуется способ поиска пакета по его имени, но он должен уже существовать.Однако, если вы предпочитаете, вы можете реализовать equals()
и hashcode()
для вашего Package
класса и использовать их непосредственно в качестве Map
ключей.
Чтобы прояснить, как это может работать, вотпример:
public Set<String> addDependencies(Item pkg, Item... dependencies) {
Set<String> pkgDependsOn = dependsOn.get(pkg.getFullyQualifiedName());
if (pkgDependsOn == null) {
pkgDependsOn = new HashSet<>();
dependsOn.put(pkg.getFullyQualifiedName(), pkgDependsOn);
}
pkgDependsOn.addAll(Stream.of(dependencies).map(dep -> dep.getFullyQualifiedName()).collect(Collectors.toSet()));
return pkgDependsOn;
}
(я мог бы вместо этого использовать Map.merge()
, но после его написания я подумал, что это достаточно сложно, чтобы сбить с толку.)
Возвращение полученного Set
изЗависимости, вероятно, излишни, но я могу представить некоторые случаи, когда это может быть полезно.
Если вы решите использовать сами пакеты в качестве ключей, это выглядит так:
public Set<Item> addDependencies(Item pkg, Item... dependencies) {
Set<Item> pkgDependsOn = dependsOn.get(pkg);
if (pkgDependsOn == null) {
pkgDependsOn = new HashSet<>();
dependsOn.put(pkg, pkgDependsOn);
}
pkgDependsOn.addAll(Arrays.asList(dependencies));
return pkgDependsOn;
}
Iя также не делаю проверку ошибок (например, если вы делаете пакет зависимым от себя), нулевые проверки и т. д.