Как уже упоминалось в комментариях, Hashtable
считается устаревшим.Его замена составляет HashMap
.Если вы хотите, чтобы HashMap
синхронизировался так же, как Hashtable
, используйте декоратор Collections::synchronizedMap
.
Структура вашего Hashtable
выглядит немного неясной.Я предполагаю, что следующая структура лучше всего соответствует вашей, и на этом я основываю свое решение.
Hashtable<String, Map<String, Set<String>>> map = new Hashtable<>();
Map<String, Set<String>> activeCsrHAProfile = new HashMap<>();
activeCsrHAProfile.put("sapd-outside", new HashSet<>(Arrays.asList("outside")));
activeCsrHAProfile.put("sapd-extra4", new HashSet<>(Arrays.asList("extra4")));
activeCsrHAProfile.put("sapd-extra3", new HashSet<>(Arrays.asList("extra3")));
activeCsrHAProfile.put("sapd-inside", new HashSet<>(Arrays.asList("inside")));
Map<String, Set<String>> standbyCsrHAProfile = new HashMap<>();
standbyCsrHAProfile.put("sapd-outside", new HashSet<>(Arrays.asList("outside")));
standbyCsrHAProfile.put("sapd-extra4", new HashSet<>(Arrays.asList("extra4")));
standbyCsrHAProfile.put("sapd-extra3", new HashSet<>(Arrays.asList("extra3")));
standbyCsrHAProfile.put("sapd-inside", new HashSet<>(Arrays.asList("inside")));
map.put("active-csr-HA-profile", activeCsrHAProfile);
map.put("standby-csr-HA-profile", standbyCsrHAProfile);
В случае, если моя структура будет немного отличаться от вашей, не будет проблем с исправлением решения для соответствия вашей структуре - принцип тот же.
Set<String> sapdOutsideOfActiveCsrHAProfile = map.get("active-csr-HA-profile")
.get("sapd-outside");
map.get("standby-csr-HA-profile").entrySet()
.stream()
.filter(i -> i.getValue().containsAll(sapdOutsideOfActiveCsrHAProfile))
.forEach(e -> System.out.println("Found at: " +
"key=" + e.getKey() + ", value=" + e.getValue()));
.filter(i -> i.getValue().containsAll(..)
фильтрует те энтрисы, значения которых Set<String>
содержат все необходимые строки. .forEach(..)
дает потребителю выполнение действия со всеми результатами сопоставления.
Если вам нужен boolean
, представляющий, произошло ли совпадение или нет, выполните:
boolean matches = map.get(..).entrySet().stream().filter(..).findFirst().isPresent();