あなたが要求したことは、非常にコストのかかる操作です。頻繁に (たとえば、サイクルで) 実行する必要がないことを確認してください。
並べ替えを維持する必要があり、頻繁に更新する場合は、カスタム コレクションを作成できます。たとえば、ボンネットの下にTreeBidiMap
andがあるものを思いつきました。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<K> keySet() {
return Collections.unmodifiableSet(map.keySet());
}
public Collection<V> values() {
return Collections.unmodifiableCollection(multiset);
}
// many more methods to be implemented, e.g. count, isEmpty etc.
// but these are fairly simple
}
このようにして、からソートされ Multiset
たが返されvalues()
ます。ただし、リストにする必要がある場合 (たとえば、配列のようなget(index)
メソッドが必要な場合) は、もっと複雑なものが必要になります。
簡潔にするために、変更不可能なコレクションのみを返します。@Lino が言及したことは正しく、keySet
orvalues
コレクションをそのまま変更すると一貫性がなくなります。values
変更可能にする一貫した方法はわかりませんが、上記のクラスのメソッドを使用する場合keySet
はサポートできます。remove
remove
MyCustomCollection