6d8683e91f686075acf2abc6c87b6354

Having a table with pairs of "key, data"

I can access data through key, but I want to acces key by data..

(I know data "could" be repeated, but this data isn't, because it's checked when add)

I would like to know if it can be optimize for speed

final private static Map<String,DataType>  table=new HashMap <String,DataType>();
    
    ///..
 
    String getKeyByData(String data)
    {
         String ret="";

         for (Entry<String,DataType> entry : table.getEntry()) 
         {
             if (entry.getValue().equals(data)) 
             {
                 ret=entry.getKey();
                 break;
             }
         }

         return ret;
    }

Refactorings

No refactoring yet !

0706636fd5e30fa66019d7ffacdb5b11

Marco Valtas

August 25, 2010, August 25, 2010 19:58, permalink

1 rating. Login to rate!

You're looking for a bidirectional map, check http://code.google.com/p/guava-libraries/ look for BiMap class.

D5dde52ca7e5b92e55cbc9bbb160b26f

Ryan Clemson

August 30, 2010, August 30, 2010 02:34, permalink

No rating. Login to rate!
final private static BidiMap<String,DataType> table = new TreeBidiMap<String,DataType>();
    
    ///..
 
    String getKeyByData(String data)
    {
         return table.getKey(data);

    }
D41d8cd98f00b204e9800998ecf8427e

Raul Huerta

October 21, 2010, October 21, 2010 16:47, permalink

No rating. Login to rate!

According to what you mentioned, wouldn't be better <DataType> to be the key? If your reqs don't permit this, i suggest you use map.entrySet() and pretty much do what you do in your If statement.

55502f40dc8b7c769880b10874abc9d0

rkr1410.myopenid.com

March 5, 2011, March 05, 2011 21:23, permalink

No rating. Login to rate!

I'm using this one I wrote some time ago, maybe you could use it:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class InvertibleHashMap<KV, VK> implements Map<KV, VK> {
    HashMap<KV, VK> original;
    HashMap<VK, KV> inverse;

    public InvertibleHashMap() {
        original = new HashMap<KV, VK>();
        inverse = new HashMap<VK, KV>();
    }

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

    @Override
    public boolean isEmpty() {
        return original.isEmpty();
    }

    @Override
    public boolean containsKey(Object key) {
        return original.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return original.containsValue(value);
    }

    @Override
    public VK get(Object key) {
        return original.get(key);
    }

    @Override
    public VK put(KV key, VK value) {
        inverse.put(value, key);
        return original.put(key, value);
    }

    @Override
    public VK remove(Object key) {
        if (original.containsKey(key)) {
            inverse.remove(original.get(key));
        }
        return original.remove(key);
    }

    @Override
    public void putAll(Map<? extends KV, ?extends VK> m) {
        original.putAll(m);
        for (KV kv : m.keySet()) {
            VK vk = m.get(kv);
            inverse.put(vk, kv);
        }
    }

    @Override
    public void clear() {
        original.clear();
        inverse.clear();
    }

    @Override
    public Set<KV> keySet() {
        return original.keySet();
    }

    @Override
    public Collection<VK> values() {
        return original.values();
    }

    @Override
    public Set<Entry<KV, VK>> entrySet() {
        return original.entrySet();
    }

    public Map<VK, KV> inverse() {
        return inverse;
    }
}

/* 
Output of the following is:
1
2
a
b
*/
public static void main(String[] args) {
    InvertibleHashMap<String, Integer> map = new InvertibleHashMap<String, Integer>();
    map.put("a", 1);
    map.put("b", 2);
 
    System.out.println(map.get("a"));
    System.out.println(map.get("b"));
    System.out.println(map.inverse().get(1));
    System.out.println(map.inverse().get(2));
}

Your refactoring





Format Copy from initial code

or Cancel