[英]Converting string arrays into Map
I have two string arrays keys and values 我有两个字符串数组键和值
String[] keys = {a,b,c,d};
String[] values = {1,2,3,4};
What is the fastest way to convert them into a map? 将它们转换为地图的最快方法是什么? I know we can iterate through them. 我知道我们可以遍历它们。 But, is there any utility present? 但是,有没有任何实用工具?
Faster than this? 比这更快?
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]);
}
}
IMHO, it's highly unlikely that you will find a utility like that. 恕我直言,你不太可能找到这样的实用工具。
But, even if you find one chances are really low that it will provide any performance gain. 但是,即使你发现一个机会真的很低,它也会提供任何性能提升。 Because, I think you won't able to do it without iterate through all the elements in both the arrays. 因为,我认为如果不迭代两个数组中的所有元素,你将无法做到这一点。
One thing I can suggest is (only if your arrays have a huge number of elements) that you can specify the capacity of the map while instantiating it to reduce overhead of resizing while you put entries into it. 我可以建议的一件事是(只有你的数组有大量的元素),你可以指定地图的容量,同时实例化它,以减少调整大小时的开销。
Map<String, String> map = new HashMap<String, String>(keys.length);
//put keys and values into map ...
If you are looking for a Map that retrieves the value associated with a key in constant time (meaning without having to look at most values), then you cannot do much faster, because the arrays need to be processed. 如果您正在寻找一个Map,它可以在恒定时间内检索与键相关联的值(意味着无需查看大多数值),那么您无法做得更快,因为需要处理数组。
However, you can use a utility already written that way : com.google.common.collect.Maps.uniqueIndex
但是,您可以使用已编写的实用程序: com.google.common.collect.Maps.uniqueIndex
If you are ok with a Map that searches the array for the key every time, then you can create the Map instantly using your two arrays, by defining a new class that implements the Map interface : 如果你没有使用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);
Another approach would be to do it "lazily", meaning modify the above class, so that it keeps a reference to a HashMap internally, and fills it only when it is looking up elements : 另一种方法是“懒惰”地执行它,意思是修改上面的类,以便它在内部保持对HashMap的引用,并且只在查找元素时填充它:
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);
}
}
This solution would mean : 这个解决方案意味着:
I purpose to you two very simple implementations. 我的目的是两个非常简单的实现。 One with stream Api of Java 8, one without. 一个是Java 8的流Api,一个没有。
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]));
Convert two String arrays to Map in Java 将两个String数组转换为Java中的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]);
}
}
Check this LINK for more solutions in different programming languages 查看此LINK以获取更多不同编程语言的解决方案
Note
: The keys should be unique.. Note
:键应该是唯一的..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.