То, что вы запрашиваете, является довольно дорогостоящей операцией, убедитесь, что вам не нужно делать это часто (например, в цикле).
В противном случае вы можете создать собственную коллекцию. Я придумал тот, у которого под капотом твои TreeBidiMap
и TreeMultiset
. Реализуйте только то, что вам нужно, и заботьтесь о целостности данных.
class MyCustomCollection implements Map<K, V> {
TreeBidiMap<K, V> map;
TreeMultiset<V> multiset;
public V put(K key, V value) {
removeValue(map.put(key, value));
multiset.add(value);
}
public boolean remove(K key) {
removeValue(map.remove(key));
}
/** removes value that was removed/replaced in map */
private removeValue(V value) {
if (value != null) {
multiset.remove(value);
}
}
public Set keySet() {
return map.keySet();
}
public Multiset values() {
return multiset;
}
// many more methods to be implemented, e.g. count, isEmpty etc.
}
Таким образом, у вас есть отсортированный Multiset
, возвращенный из values()
. Однако, если вам нужно, чтобы он был списком (например, вам нужен метод get(index)
, подобный массиву), вам придется изобрести что-то более сложное.