Вы можете использовать только один Map<String, KeyOrValue>
, где значением может быть интерфейс маркера с двумя реализациями
interface KeyOrValue {}
class Key implements KeyOrValue {
private String key;
}
class Value implements KeyOrValue {
private List<String> values;
}
Затем вы можете просто создать метод поиска, который рекурсивно вызывает себя, а затем возвращает значение один раз.он достиг конца:
private final Map<String, KeyOrValue> map = ...
public List<String> getValues(String key) {
KeyOrValue keyOrValue = map.get(key);
if(keyOrValue instanceof Key) {
// is a key, so use recursion to get the value
key = ((Key) keyOrValue).key;
return getValues(key);
} else if(keyOrValue instanceof Value) {
// is a value, so just return the value it holds
return ((Value) keyOrValue).values;
} else {
// no mapping was found for "key"
return null;
}
}
Вы можете сделать то же самое и без рекурсии:
public List<String> getValues(String key) {
KeyOrValue keyOrValue;
List<String> values = null;
do {
keyOrValue = map.get(key);
if(keyOrValue instanceof Key) {
// is a key, so iterate further
key = ((Key) keyOrValue).key;
} else if(keyOrValue instanceof Value) {
// is a value, so get the values out and set the key to null to break the loop
values = ((Value) keyOrValue).values;
key = null;
}
} while(key != null);
// return the values, may be null due to nothing being found
return values;
}
Интерфейс маркера на самом деле не нужен, но вы можете получить то же самоерезультат, если вы просто используете Map<String, Object>
, где значение может быть либо String
, либо List<String>
, и тогда проверки instanceof
также должны быть адаптированы, но мне нравится подход с добавлением interface