Re: Encapsulating HashMap bulding
On 11.05.2010 07:52, Robert Klemme wrote:
On 11.05.2010 00:20, Roedy Green wrote:
Can anyone think of a way to write a method that takes an array of X,
and produces a HashMap<Key,X>
How would you specify the name of the key field/method?
Maybe you could do it by making X implement an interface that defines
the key.
Perhaps you could do it with reflection.
I'd rather provide an interface that is responsible for the conversion
from X to Key - this is more modular.
Here's the more generics savvy solution:
package util;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class MapUtil {
public interface Transformer<A, B> {
B transform(A a);
}
public static <K, V> Map<K, V> createHash(V[] i, Transformer<? super
V, ? extends K> t) {
return createHash(Arrays.asList(i), t);
}
public static <K, V> Map<K, V> createHash(Iterable<? extends V> i,
Transformer<? super V, ? extends K> t) {
final Map<K, V> map = new HashMap<K, V>();
fill(map, i, t);
return map;
}
public static <K, V> void fill(Map<K, V> m, Iterable<? extends V> i,
Transformer<? super V, ? extends K> t) {
for (V val : i) {
m.put(t.transform(val), val);
}
}
}
Example usage
public static void main(String[] args) {
System.out.println(Arrays.asList(args));
Map<Integer, String> m = createHash(args, new Transformer<String,
Integer>() {
@Override
public Integer transform(String a) {
return a == null ? 0 : a.length();
}
});
System.out.println(m);
}
Cheers
robert
--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/