src/main/java/com/workplacesystems/utilsj/collections/TransactionalBidiTreeMap.java
public FilterableCollection<V> valuesByValue() {

        if (collectionOfValuesByValue == null) {
            collectionOfValuesByValue = new AbstractFilterableCollection<V>() {

                @Override
                public Iterator<V> iterator() {

                    return new TransactionalBidiTreeMapIterator<V>(VALUE) {

                        @Override
                        protected V doGetNext() {
                            return (V)lastReturnedNode.getData(VALUE);
                        }
                    };
                }

                @Override
                public int size() {
                    return TransactionalBidiTreeMap.this.size();
                }

                @Override
                public boolean contains(Object o) {
                    return containsValue(o);
                }

                @Override
                public boolean remove(Object o) {

                    int oldnodeCount = nodeCount;

                    removeValue(o);

                    return nodeCount != oldnodeCount;
                }

                @Override
                public boolean removeAll(Collection<?> c) {

                    boolean     modified = false;
                    Iterator<?> iter     = c.iterator();

                    while (iter.hasNext()) {
                        if (removeValue(iter.next()) != null) {
                            modified = true;
                        }
                    }

                    return modified;
                }

                @Override
                public void clear() {
                    TransactionalBidiTreeMap.this.clear();
                }
            };
        }

        return collectionOfValuesByValue;
    }
public FilterableCollection<V> valuesByValue() {

        if (collectionOfValuesByValue == null) {
            collectionOfValuesByValue = new AbstractFilterableCollection<V>() {

                @Override
                public Iterator<V> iterator() {

                    return new TransactionalBidiTreeMapIterator<V>(VALUE) {

                        @Override
                        protected V doGetNext() {
                            return (V)lastReturnedNode.getData(VALUE);
                        }
                    };
                }

                @Override
                public int size() {
                    return TransactionalBidiTreeMap.this.size();
                }

                @Override
                public boolean contains(Object o) {
                    return containsValue(o);
                }

                @Override
                public boolean remove(Object o) {

                    int oldnodeCount = nodeCount;

                    removeValue(o);

                    return nodeCount != oldnodeCount;
                }

                @Override
                public boolean removeAll(Collection<?> c) {

                    boolean     modified = false;
                    Iterator<?> iter     = c.iterator();

                    while (iter.hasNext()) {
                        if (removeValue(iter.next()) != null) {
                            modified = true;
                        }
                    }

                    return modified;
                }

                @Override
                public void clear() {
                    TransactionalBidiTreeMap.this.clear();
                }
            };
        }

        return collectionOfValuesByValue;
    }
Returns a collection view of the values contained in this
map. The collection is backed by the map, so changes to the map
are reflected in the collection, and vice-versa. If the map is
modified while an iteration over the collection is in progress,
the results of the iteration are undefined. The collection
supports element removal, which removes the corresponding
mapping from the map, via the Iterator.remove,
Collection.remove, removeAll, retainAll and clear operations.
It does not support the add or addAll operations.<p>

The difference between this method and values is that values's
iterator() method returns an iterator that iterates over the
values in ascending order by key. This method's iterator method
iterates over the values in ascending order by value.

@return a collection view of the values contained in this map.