Hi Tagir,

I am hesitant to add new interfaces specific to Set/Map for a non-indexed 
encounter order.

The interface OrderedSet is tantalizingly queue-like, in fact rather close to 
the read-only part of Deque.  Did you consider the possibility of LinkedHashSet 
implementing Deque?

I have not thought about this too deeply, but since LinkedHashMap is 
implemented as a doubly linked list it might be possible (as LinkedList 
implements Deque).  

If so we could also add the method:

  LinkedHashSet<Map.Entry<K,V>> LinkedHashMap.entryLinkedSet()

and thereby avoid the addition of any new interfaces, although it might require 
some refinement to the specification of Deque; a new notion of an unmodifiable 
queue, which I admit is a little odd, and as a result is probably not be a good 
idea.

More generally I think the core abstraction is really a new form Iterable 
supporting access to first + last elements and reverse iteration (and possibly 
iteration starting from a containing element).  

Paul.

> On Apr 25, 2020, at 9:51 AM, Tagir Valeev <amae...@gmail.com> wrote:
> 
> Hello!
> 
> To me, it was always a pity that the internal structure of
> LinkedHashMap allows doing more things easily, yet this functionality
> is not exposed to the external clients, so if somebody really needs
> such things they will need to waste memory/CPU to emulate them. The
> functionality I'm speaking about includes:
> - getting the last (i.e. most recently added/accessed) entry
> - getting the descending iterator going from newest to oldest entries
> - getting the iterator that starts at given existing entry
> 
> It's easy to do such things with TreeMap and other NavigableMap
> implementations. However, LinkedHashMap provides no additional visible
> methods in addition to the Map interface (well, except
> removeEldestEntry()). The same considerations apply to LinkedHashSet.
> 
> So we can provide new interfaces j.u.OrderedMap and OrderedSet that
> provide the additional functionality and make
> LinkedHashMap/LinkedHashSet implement them. Aside from new
> functionality, the interfaces will carry additional semantics: their
> iteration order is always predictable and their spliterators return
> DISTINCT|ORDERED characteristics, so some clients may require
> OrderedMap/Set just to assert that they rely on predictable iteration
> order. We can even make existing NavigableMap/Set extend
> OrderedMap/Set because NavigableMap/Set are ordered. Some of
> NavigableMap/Set methods will naturally fit the OrderedMap/Set
> interfaces.
> 
> I think I can devote my spare time to write the spec, implementation,
> and tests for this enhancement, participate in the API design
> discussions and do any other job necessary to make this improvement
> happen. However, I'd like to know in advance whether such kind of
> change would be met positively. What do you think? Is it possible to
> do this or this improvement contradicts the OpenJDK goals and will
> likely be rejected? Also, do I need to write a JEP for this?
> 
> It's probably too early to discuss the exact API, but for more
> specificity of my proposal, here's the quick draft:
> 
> package java.util;
> 
> public interface OrderedSet<E> extends Set<E> {
>  // First or NSEE if empty
>  E first() throws NoSuchElementException;
>  // Last or NSEE if empty
>  E last() throws NoSuchElementException;
>  // Retrieve&remove first or null if empty
>  E pollFirst();
>  // Retrieve&remove last or null if empty
>  E pollLast();
>  // Iterator starting from element, or NSEE if not found
>  Iterator<E> iteratorFrom(E fromElement) throws NoSuchElementException;
>  // Descending
>  Iterator<E> descendingIterator();
>  // Descending iterator starting from element, or NSEE if not found
>  Iterator<E> descendingIteratorFrom(E fromElement) throws
> NoSuchElementException;
>  // TBD: descendingSet()
> }
> 
> All the methods except iteratorFrom and descendingIteratorFrom are
> already present in NavigableSet, so the spec will be mostly copied
> from there. For iteratorFrom and descendingIteratorFrom it's easy to
> provide a default implementation in NavigableSet. All methods can be
> implemented easily in LinkedHashSet and LinkedHashMap::keySet
> 
> package java.util;
> 
> public interface OrderedMap<K, V> extends Map<K, V> {
>  // First entry or null if empty
>  Map.Entry<K,V> firstEntry();
>  // Last entry or null if empty
>  Map.Entry<K,V> lastEntry();
>  // Retrieve&remove first entry or null if empty
>  Map.Entry<K,V> pollFirstEntry();
>  // Retrieve&remove last entry or null if empty
>  Map.Entry<K,V> pollLastEntry();
>  // First key or NSEE if empty
>  K firstKey();
>  // Last key or NSEE if empty
>  K lastKey();
>  // Ordered keySet()
>  OrderedSet<K> orderedKeySet();
>  // TBD: OrderedSet<K> descendingKeySet();
>  // TBD: OrderedSet<Entry<K,V>> orderedEntrySet();
> }
> 
> All the methods except orderedKeySet() are already present in
> NavigableMap, and the orderedKeySet() is just an alias for
> navigableKeySet(). Also, all of them can be implemented easily in
> LinkedHashMap.
> 
> Any feedback is welcome.
> 
> Thank you in advance,
> Tagir Valeev.

Reply via email to