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 !
Marco Valtas
August 25, 2010, August 25, 2010 19:58, permalink
You're looking for a bidirectional map, check http://code.google.com/p/guava-libraries/ look for BiMap class.
Ryan Clemson
August 30, 2010, August 30, 2010 02:34, permalink
You could also use BidiMap in Apache Commons Collections
http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/BidiMap.html
final private static BidiMap<String,DataType> table = new TreeBidiMap<String,DataType>();
///..
String getKeyByData(String data)
{
return table.getKey(data);
}
Raul Huerta
October 21, 2010, October 21, 2010 16:47, permalink
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.
rkr1410.myopenid.com
March 5, 2011, March 05, 2011 21:23, permalink
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));
}
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