作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有一个来自 Apache 的开源 util 库,我在其中找到了一种将数组转换为映射的方法:
public static Map toMap(Object[] array) {
if (array == null) {
return null;
}
final Map map = new HashMap((int) (array.length * 1.5));
for (int i = 0; i < array.length; i++) {
Object object = array[i];
if (object instanceof Map.Entry) {
Map.Entry entry = (Map.Entry) object;
map.put(entry.getKey(), entry.getValue());
} else if (object instanceof Object[]) {
Object[] entry = (Object[]) object;
if (entry.length < 2) {
throw new IllegalArgumentException("Array element " + i + ", '"
+ object
+ "', has a length less than 2");
}
map.put(entry[0], entry[1]);
} else {
throw new IllegalArgumentException("Array element " + i + ", '"
+ object
+ "', is neither of type Map.Entry nor an Array");
}
}
return map;
}
因为我不喜欢警告,所以我尝试添加泛型。但我不知道如何将数据类型从输入数组传输到输出映射。
这可能吗?
最佳答案
只有创建两个单独的方法才有可能:一个处理 Map.Entry
元素,另一个处理“数组”元素(例如 {"RED", "#FF0000"}
).这是代码:
public static <K, V> Map<K, V> toMap(Map.Entry<K, V>[] array) {
if (array == null) {
return null;
}
final Map<K, V> map = new HashMap<K, V>((int) (array.length * 1.5));
for (int i = 0; i < array.length; i++) {
Map.Entry<K, V> entry = array[i];
map.put(entry.getKey(), entry.getValue());
}
return map;
}
@SuppressWarnings("unchecked")
public static <K, V> Map<K, V> toMap(Object[][] array) {
if (array == null) {
return null;
}
final Map<K, V> map = new HashMap<K, V>((int) (array.length * 1.5));
for (int i = 0; i < array.length; i++) {
Object[] entry = array[i];
map.put((K) entry[0], (V) entry[1]);
}
return map;
}
尽管有些代码是重复的,但可以说它更优雅。恐怕第二种方法没有更好的解决方案; array
只能在运行时具体化。因此,必须进行“未经检查”的转换。
关于java - 将泛型添加到 ArrayUtils.toMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416346/
我是一名优秀的程序员,十分优秀!