Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #14417

Re: How associate two HashMaps

Path csiph.com!v102.xanadu-bbs.net!xanadu-bbs.net!news.glorb.com!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
From Lew <lewbloch@gmail.com>
Newsgroups comp.lang.java.programmer
Subject Re: How associate two HashMaps
Date Tue, 8 May 2012 09:27:58 -0700 (PDT)
Organization http://groups.google.com
Lines 135
Message-ID <11781872.127.1336494478259.JavaMail.geo-discussion-forums@pbqn10> (permalink)
References <2d99b203-7059-4ca9-9632-379cd0ae8c85@ee2g2000vbb.googlegroups.com> <Maps-20120508062125@ram.dialup.fu-berlin.de> <joalio$buo$1@speranza.aioe.org>
NNTP-Posting-Host 69.28.149.29
Mime-Version 1.0
Content-Type text/plain; charset=ISO-8859-1
Content-Transfer-Encoding quoted-printable
X-Trace posting.google.com 1336494851 19303 127.0.0.1 (8 May 2012 16:34:11 GMT)
X-Complaints-To groups-abuse@google.com
NNTP-Posting-Date Tue, 8 May 2012 16:34:11 +0000 (UTC)
In-Reply-To <joalio$buo$1@speranza.aioe.org>
Complaints-To groups-abuse@google.com
Injection-Info glegroupsg2000goo.googlegroups.com; posting-host=69.28.149.29; posting-account=CP-lKQoAAAAGtB5diOuGlDQk0jIwmH0T
User-Agent G2/1.0
Xref csiph.com comp.lang.java.programmer:14417

Show key headers only | View raw


javax.swing.JSnarker wrote:
> Stefan Ram wrote:
>> Ricardo Nuno writes:
>>> What do I need to associate a value, from one hashMap to a key from a
>>> new HashMap
>>
>>    It is hard to parse this sentence with the comma.
>>
>>    »To associate a value to a key« is a little bit vague.
> 
> My guess is that he wants a bidirectional map. For that you'd need a 
> custom class delegating to two internal HashMap instances. Something like
> 
> public class BidiMap<K,V> extends AbstractMap<K,V> {

In Apache Commons Collections 'BidiMap' is an interface with a double handful 
of implementing classes:
<http://commons.apache.org/collections/api-release/org/apache/commons/collections/BidiMap.html>

>      private Map<K,V> map1, map2;
>      private BidiMap<V,K> reversed;
> 
>      public BidiMap () {
>          map1 = new HashMap<K,V>();
>          map2 = new HashMap<K,V>();
>          reversed = new BidiMap<K,V>(map2, map1, this);
>      }
> 
>      private BidiMap (Map<K,V> map1, Map<K,V> map2, BidiMap<V,K> reversed) {
>          this.map1 = map1; this.map2 = map2; this.reversed = reversed;
>      }
> 
>      private BidiMap<V,K> getReversedMap () {
>          return reversed;
>      }
> 
>      /* Map methods go here. View methods delegate to map1. Modifying
>         methods operate on both maps, but reverse key and value when
>         modifying map2. Also, if a value is already in map2, looks
>         it up in map2 to find the corresponding key and removes
>         that key from map1 before adding the new mappings to both maps.
>      */
> }
> 
> Changes to the reversed map will be reflected in the original and vice 
> versa.

JSnarker's example is a good one for understanding the mechanics of the 
bidirectional map. The Apache Commons libraries are the go-to source for 
most convenience types not in the standard API.

If you need a different kind of association, well, there are all kinds of ways 
to do that, as Stefan pointed out.

Another possibility is that you're looking for a way to associate more than one value with the same key. There are a number of ways to do that:

Here's one (not tried or even compiled here, so might need tweaking):

public interface Pair<L, R>
{
  L getLeft();
  R getRight();
}

public class BasePair<L, R> implements Pair<L, R>
{
  private final L left;
  private final R right;
  public BasePair(L left, R right)
  {
    this.left = left;
    this.right = right;
  }

  public L getLeft() { return left; }
  public R getRight() { return right; }
}

public class MultiAssociator<K, L, R>
{
  private final Map<K, Pair<L, R>> associator = new HashMap<>();

  public Pair<L, R> put(K key, Pair<L, R> pair)
  {
    if (key == null || pair == null) 
    {
      throw new IllegalArgumentException("Argument cannot be null");
    }
    return associator.put(key, pair);
  }

  public Pair<L, R> put(K key, L left, R right)
  {
    return associator.put(key, new Pair<>(left, right));
  }

  public Pair<L, R> put(K key, L left)
  {
    if (key == null) 
    {
      throw new IllegalArgumentException("Argument cannot be null");
    }
    Pair<L, R> value = associator.get(key);
    Pair<L, R> repla = value == null? new Pair<>(left, null) 
                : new Pair<>(left, value.getRight());
    return associator.put(key, repla);
  }

  public Pair<L, R> put(K key, R right)
  {
    if (key == null) 
    {
      throw new IllegalArgumentException("Argument cannot be null");
    }
    Pair<L, R> value = associator.get(key);
    Pair<L, R> repla = value == null? new Pair(null, right) 
                : new Pair(value.getLeft(), right);
    return associator.put(key, repla);
  }

  public Pair<L, R> get(K key)
  {
    return associator.get(key);
  }
}

-- 
Lew

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

How associate two HashMaps Ricardo Nuno <9724@bigfoot.com> - 2012-05-07 21:07 -0700
  Re: How associate two HashMaps "javax.swing.JSnarker" <gharriman@boojum.mit.edu> - 2012-05-08 04:30 -0400
    Re: How associate two HashMaps Lew <lewbloch@gmail.com> - 2012-05-08 09:27 -0700
  Re: How associate two HashMaps Roedy Green <see_website@mindprod.com.invalid> - 2012-05-08 03:26 -0700

csiph-web