Uploaded image for project: 'Commons Collections'
  1. Commons Collections
  2. COLLECTIONS-244

Proposal to support generic multi-key maps with keys of different types

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • None
    • 4.x
    • Map
    • None

    Description

      MultiKeyMap as designed can only accept keys of the same type, if made to support generics, i.e.

      MultiKeyMap<MultiKey<String>,Integer> map = ...;
      map.put("foo", "bar", 10);

      // not possible
      //MultiKeyMap<MultiKey<String,Integer>,Double> map = ...;

      Attached is a proposal that may support multi-key maps with keys of different types. I do not believe varying numbers of typed keys can be supported in a single interface, thus this proposal includes

      BinaryKey<K1,K2>
      BinaryKeyMap<K1,K2,V> extends Map<BinaryKey<K1,K2>,V>
      TertiaryKey<K1,K2,K3>
      TertiaryKeyMap<K1,K2,K3,V> extends Map<TertiaryKey<K1,K2,K3>,V>
      QuaternaryKey<K1,K2,K3,K4>
      QuaternaryKeyMap<K1,K2,K3,K4,V> extends Map<QuaternaryKey<K1,K2,K3,K4>,V>

      To prevent unnecessary object creation, I also propose to support MapIterator-style iterators:

      BinaryKeyMapIterator<K1,K2,V> extends Iterator<V>
      TertiaryKeyMapIterator<K1,K2,K3,V> extends Iterator<V>
      QuaternaryKeyMapIterator<K1,K2,K3,K4,V> extends Iterator<V>

      Current multi-map MapIterator support is implemented as Iterator<K1> but I find that Iterator<V> makes more sense here. It is not possible to support MapIterator<K,V> without object creation, e.g. MapIterator<BinaryKey<K1,K2>,V> must create BinaryKey objects for each call to next().

      Attachments

        1. multi-map.tar.gz
          8 kB
          Michael Heuer

        Activity

          People

            Unassigned Unassigned
            heuermh@acm.org Michael Heuer
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: