我有两个字符串数组keys和values。
String[] keys = {a,b,c,d};
String[] values = {1,2,3,4};
什么是最快的将它们转换为地图的方法?我知道我们可以遍历它们。但是,是否有任何现有的工具可用?
我有两个字符串数组keys和values。
String[] keys = {a,b,c,d};
String[] values = {1,2,3,4};
有比这更快的方法吗?
Map<String,String> map = new HashMap<>();
if(keys.length == values.length){
for(int index = 0; index < keys.length; index++){
map.put(keys[index], values[index]);
}
}
if(keys.length != values.length) {
throw new IllegalArgumentException("Keys and Values need to have the same length.");
}
Map<String,String> map = new HashMap<>();
for (int i = 0; i < keys.length; i++) {
map.put(keys[i], values[i]);
}
if(keys.length != values.length) {
throw new IllegalArgumentException("Keys and Values need to have the same length.");
}
Map<String,String> map = IntStream.range(0, keys.length).boxed()
.collect(Collectors.toMap(i -> keys[i], i -> values[i]));
如果您正在寻找一种可以在常数时间内检索与关键字相关联的值(即无需查看大多数值)的Map,则您不能更快,因为需要处理数组。
但是,您可以使用已经编写成这样的实用程序:com.google.common.collect.Maps.uniqueIndex
如果您对每次搜索该数组中的关键字的Map感到满意,则可以通过定义一个实现Map接口的新类,并使用两个数组即可立即创建Map:
class TwoArrayMap implements Map<String, String> {
private final String[] keys;
private final String[] values;
// If you want to enable to add more key value pairs to your map, and
// want to make the process faster, you could use ArrayLists instead of arrays
public TwoArrayMap(String[] array1, String[] array2){
if(array1 == null || array2 == null || array2.length < array1.length)
throw new IllegalArgumentException();
keys = array1;
values = array2;
// Alternatively, you could want to clone the arrays, to
// make sure they are not modified, using array1.clone(), etc
}
public String get(String key){
for(int i=0; i<keys.length; i++)
if(key == null && key == null || key != null && key.equals(k) )
return values[i];
return null;
}
public String put(String key, String Value) throws OperationNotSupportedException {
throw new OperationNotSupportedException();
// alternatively, you could resize the arrays and add a new key, or use an ArrayList
}
}
Map<String, String> myMap = new TwoArrayMap(keys, values);
另一种方法是“懒惰”地进行转换,即修改上述类,使其在查找元素时仅在必要时填充内部哈希映射表:
class TwoArrayMap implements Map<String, String> {
private final Map<String, String> hashmap;
private int maxIndexAlreadyTransferred = -1;
private final String[] keys;
private final String[] values;
public TwoArrayMap(String[] array1, String[] array2){
if(array1 == null || array2 == null || array2.length < array1.length)
throw new IllegalArgumentException();
hashmap = new HashMap<>();
keys = array1;
values = array2;
// Alternatively, you could want to clone the arrays, to
// make sure they are not modified, using array1.clone(), etc
}
public String get(String key){
if(hashmap.containsKey(key))
return hashmap.get(key);
String k, value;
while( maxIndexAlreadyTransferred + 1 < keys.length ){
k = keys[ maxIndexAlreadyTransferred + 1 ];
value = values[ maxIndexAlreadyTransferred +1 ];
if(!hashmap.containsKey(k))
hashmap.put( k, value );
maxIndexAlreadyTransferred++;
if(key == null && k == null || key != null && key.equals(k) )
return value;
}
return null;
}
public String put(String key, String Value) {
hashmap.put(key, value);
}
}
在我看来,你很难找到这样的实用程序。
即使你找到了一个,它提供性能增益的可能性也非常低。因为,我认为你无法在不迭代两个数组中的所有元素的情况下完成它。
我可以建议一件事(仅当你的数组有大量元素时),就是在实例化映射时指定其容量,以减少在将条目放入映射时调整大小的开销。
Map<String, String> map = new HashMap<String, String>(keys.length);
//put keys and values into map ...
import java.util.HashMap;
public static void main(String[] args){
String[] keys= {"a", "b", "c"};
int[] vals= {1, 2, 3};
HashMap<String, Integer> hash= new HashMap<String, Integer>();
for(int i= 0; i < keys.length; i++){
hash.put(keys[i], vals[i]);
}
}
请查看此链接,以获取不同编程语言的更多解决方案。
注意
:键应该是唯一的。