java - 将参数数组转换为 HashMap

标签 java algorithm collections

<分区>

我有一个像这样的字符串数组:

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

关于java - 将参数数组转换为 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562828/

相关文章:

mongodb - 总是产生相同哈希的无序 2 字符串哈希函数

java - Apache Spark 需要 5 到 6 分钟才能从 Cassandra 简单地计算 10 亿行

java - 以动态和编程方式添加定义的 TextInputLayout

algorithm - 回溯优化

python - 如何将项目添加到 collection.Counter?然后将它们分类为 ASC?

python - 如何将项目添加到 OrderedDict

java - 从 HashMultiMap 获取有序数组

java - Controller 用整个 View 响应 AJAX 请求

java - 使用嵌套 for 循环填充多维数组

algorithm - 可变数量的集合之间的模糊选择