src/main/java/com/workplacesystems/utilsj/collections/TransactionalBidiTreeMap.java
public FilterableSet<Entry<K,V>> entrySetByValueDescending() {

        return new AbstractFilterableSet<Entry<K,V>>() {

            @Override
            public Iterator<Entry<K,V>> iterator() {

                return new TransactionalBidiTreeMapDescendingIterator<Entry<K,V>>(VALUE) {

                    @Override
                    protected Entry<K,V> doGetNext() {
                        return lastReturnedNode;
                    }
                };
            }

            @Override
            public boolean contains(Object o) {

                if (!(o instanceof Map.Entry)) {
                    return false;
                }

                Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
                Object         key   = entry.getKey();
                Node<K,V>      node  = lookupValid(entry.getValue(),
                                         VALUE,
                                         getCurrentThreadId());

                return (node!=null) && node.getData(KEY).equals(key);
            }

            @Override
            public boolean remove(Object o) {

                if (!(o instanceof Map.Entry)) {
                    return false;
                }

                String thread_id = getCurrentThreadId();

                Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
                Object         key   = entry.getKey();
                Node<K,V>      node  = lookupValid(entry.getValue(),
                                         VALUE,
                                         thread_id);

                if ((node!=null) && node.getData(KEY).equals(key)) {
                    if (auto_commit || node.is(Node.ADDED, thread_id))
                        doRedBlackDelete(node);
                    else
                        node.setStatus(Node.DELETED, thread_id);

                    return true;
                }

                return false;
            }

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

            @Override
            public void clear() {
                TransactionalBidiTreeMap.this.clear();
            }
        };
    }
public FilterableSet<Entry<K,V>> entrySetByValueDescending() {

        return new AbstractFilterableSet<Entry<K,V>>() {

            @Override
            public Iterator<Entry<K,V>> iterator() {

                return new TransactionalBidiTreeMapDescendingIterator<Entry<K,V>>(VALUE) {

                    @Override
                    protected Entry<K,V> doGetNext() {
                        return lastReturnedNode;
                    }
                };
            }

            @Override
            public boolean contains(Object o) {

                if (!(o instanceof Map.Entry)) {
                    return false;
                }

                Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
                Object         key   = entry.getKey();
                Node<K,V>      node  = lookupValid(entry.getValue(),
                                         VALUE,
                                         getCurrentThreadId());

                return (node!=null) && node.getData(KEY).equals(key);
            }

            @Override
            public boolean remove(Object o) {

                if (!(o instanceof Map.Entry)) {
                    return false;
                }

                String thread_id = getCurrentThreadId();

                Map.Entry<K,V> entry = (Map.Entry<K,V>) o;
                Object         key   = entry.getKey();
                Node<K,V>      node  = lookupValid(entry.getValue(),
                                         VALUE,
                                         thread_id);

                if ((node!=null) && node.getData(KEY).equals(key)) {
                    if (auto_commit || node.is(Node.ADDED, thread_id))
                        doRedBlackDelete(node);
                    else
                        node.setStatus(Node.DELETED, thread_id);

                    return true;
                }

                return false;
            }

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

            @Override
            public void clear() {
                TransactionalBidiTreeMap.this.clear();
            }
        };
    }
Returns a set view of the mappings contained in this map. Each
element in the returned set is a Map.Entry. The set is backed
by the map, so changes to the map are reflected in the set, and
vice-versa.  If the map is modified while an iteration over the
set is in progress, the results of the iteration are
undefined. The set supports element removal, which removes the
corresponding mapping from the map, via the Iterator.remove,
Set.remove, removeAll, retainAll and clear operations.  It does
not support the add or addAll operations.<p>

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

@return a set view of the mappings contained in this map.