我有一个像这样的字符串数组:
String [] paramEnv = {"key1=value1","key2=value2","key2=value2"};
现在我需要将它转换为 HashMap。
我为它写了两种方法,想知道哪种方法效率更高。
方法一:
String param = "";
String paramName = "";
String paramValue = "";
if ((null != paramEnv) && (paramEnv.length > 0)) {
for (int i = 0; i < paramEnv.length; i++) {
param = paramEnv[i];
int indexOfEqualTo = param.indexOf("=");
paramName = param.substring(0, indexOfEqualTo);
paramValue = param.substring(indexOfEqualTo + 1);
hmKeyValFromParamEnv.put(paramName, paramValue);
}
}
return hmKeyValFromParamEnv;
方法二:
String param = "";
String paramName = "";
String paramValue = "";
if ((null != paramEnv) && (paramEnv.length > 0)) {
for (int i = 0; i < paramEnv.length; i++) {
param = paramEnv[i];
paramName = (param.split("="))[0];
paramValue = (param.split("="))[1];
hmKeyValFromParamEnv.put(paramName, paramValue);
}
}
return hmKeyValFromParamEnv;
请让我知道任何更好的实现方式。
如果你可以使用 Java 8
public class ArrayToMap {
public static void main(String[] args) {
String[] arr = new String[]{"key1=value1","key2=value2"};
Arrays.stream(arr)
.map(s -> s.split("="))
.collect(Collectors.toMap(sa -> sa[0], sb -> sb[1], (v1, v2)->v1));
}
}
- 从数组创建流
- 将每个数组元素映射为两个元素数组(拆分)
- 收集它以使用自定义合并功能进行映射
//编辑:
添加重复消除。这只是一个例子。您应该制定自己的策略来消除重复项(如果您需要一些特定的)。
//编辑 2:
在@ZouZou 的评论后将 impl 更改为使用自定义合并功能
//编辑 3:
如果您不能使用 Java 8,请使用 Guava :
class KeyEntry<K, V> implements Map.Entry<K, V> {
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof KeyEntry)) {
return false;
}
KeyEntry keyEntry = (KeyEntry) o;
if (!key.equals(keyEntry.key)) {
return false;
}
return true;
}
@Override
public String toString() {
return "{\"KeyEntry\":{" +
"\"key\": \"" + key + "\"" +
", \"value\": \"" + value + "\"" +
"}}";
}
@Override
public int hashCode() {
return key.hashCode();
}
KeyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
throw new UnsupportedOperationException("NO!");
}
private final K key;
private final V value;
}
因为常见的 Entry
impl 在 equals
中使用键和值,我们需要自定义类。
然后我们可以创建类似这样的东西:
Map<String, String> m = new HashMap<>();
ImmutableSet<Map.Entry<String, String>> uniqueKey = FluentIterable.from(new ArrayList<String>(Arrays.asList(arr)))
.transform(new Function<String, Map.Entry<String, String>>() {
@Override
public Map.Entry<String, String> apply(String s) {
String[] splited = s.split("=");
return new KeyEntry(splited[0], splited[1]) {
};
}
}).toSet();
for (Map.Entry<String, String> s : uniqueKey) {
m.put(s.getKey(), s.getValue());
System.out.println(s);
}
- 将每个元素转换为我们的
KeyEntry
- 制作
集合
- 重写为
Map