Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #14417
| 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 | Next — Previous in thread | Next in thread | Find similar | Unroll 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