Первое, что нужно отметить, это то, что вам на самом деле не нужна обратная карта, если ваши значения только true или false. Это будет иметь смысл, если у вас более широкий диапазон значений.
Один простой (но не очень элегантный) способ получить записи с определенным значением:
public static <T, E> Set<T> getKeysByValue(Map<T, E> map, E value) {
Set<T> keys = new HashSet<T>();
for (Entry<T, E> entry : map.entrySet()) {
if (entry.getValue().equals(value)) {
keys.add(entry.getKey());
}
}
return keys;
}
Вы можете видеть, что это не так хорошо, если вам нужно звонить время от времени. Имеет смысл иметь две разные карты (прямую и обратную) и добавлять записи в обе. Вы не можете использовать карты Bidi, так как между ключами и значениями нет отношения 1: 1.
ОБНОВЛЕНИЕ: следующее решение не будет работать. Смотрите комментарии.
Вы также можете рассмотреть возможность использования TreeMap и сортировать его по значению. Таким образом, вы можете иметь отсортированный набор, вызывая map.entrySet()
в любое время (сначала запрещает ввод, затем разрешает). Недостатком является то, что это только один набор.
ValueComparator bvc = new ValueComparator(map);
TreeMap<String,Boolean> sorted_map = new TreeMap(bvc);
class ValueComparator implements Comparator {
Map base;
public ValueComparator(Map base) {
this.base = base;
}
public int compare(Object a, Object b) {
return (Boolean)base.get(a).compareTo((Boolean)base.get(b));
}
}