将数组输入到Hashmap中

时间:2013-02-19 10:29:14

标签: java hashmap

我觉得这是一个非常简单的问题,但我找不到答案。

您可以将数组对象输入到HashMap的put方法吗?

示例:

假设你有一个HashMap:
HashMap<Integer, String> map = new HashMap <Integer, String>();

你有一个整数数组和一个方便的字符串数组。数组未按如下所示进行初始化,但包含未知值(这更容易说明结果)。

int[] keys = {1, 3, 5, 7, 9};
String[] values = {"turtles", "are", "better", "than", "llamas"};

我希望HashMap的键值对为:

1, turtles
3, are
5, better
7, than
9, llamas

这可以用map.put(keys, values)这样的方法来实现吗?我知道这不起作用,你应该得到一个错误,如“ HashMap类型中的方法put(Integer,String)不适用于参数(int [],String [])” 。我只想要比以下更有效,更优雅或更紧凑的东西:

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}

5 个答案:

答案 0 :(得分:5)

我无法想象

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}

可以提高效率。如果这是你经常要做的事情那么我可能会围绕Map写一个帮助对象。

请注意,如果要添加的值在地图中已经,则Map.putAll()存在。

答案 1 :(得分:2)

在我看来,你已经发现了解决这个问题的非常直接的方法。

HashMap<Integer, String> map = new HashMap <Integer, String>();
int[] keys = {1, 3, 5, 7, 9};
String[] values = {"turtles", "are", "better", "than", "llamas"};

for(int i = 0; i < keys.length; i++){
    map.put(keys[i], values[i]);
}

答案 2 :(得分:0)

如果您需要此行为,则需要解析每个元素以将它们放入HashMap。最坏的情况复杂性将是 O(n),你不能减少它。您需要触摸所有元素以填充HashMap
下面的代码(如你所述)是唯一的解决方法

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}

答案 3 :(得分:0)

没有其他方法可以直接将数组放入Map中。您需要遍历数组的每个元素并将一个键值对插入Map。

答案 4 :(得分:0)

除了好的for之外,您还可以随时实施自己的解决方案。对于一个非常详细的方法:

 public class MapFromArrayBuilder {
     private MapFromArrayBuilder() {}

     public static <K, V> Binder<K, V> map(K[] keys, V[] values) {
         return new Binder(keys, values);
     }   

     public static class Binder<K, V> {
         private final V[] values;
         private final K[] keys;

         public Binder(K[] keys, V[] values) { this.keys = keys; this.values = values; }

         public void into(Map<K, V> map) {
             for (int i = 0; i < keys.length; i++) {
                 map.put(keys[i], values[i]);
             }   
         }   
     }       

用它你可以做类似

的事情
 public static void main(String[] args) {
     Map<Integer, String> leMap = new LinkedHashMap<Integer, String>();

     map(new Integer[] {0}, new String[] {"teste"}).into(leMap);

     for (Integer key : leMap.keySet()) {
         System.out.format("%d = %s\n", key, leMap.get(key));
     }   
 }  

但它只是为了提高可读性而创建对象:P不是最具性能的解决方案,但读它很酷:)

无论如何,更喜欢好老for。我喜欢创建这种类型的构造只是为了好玩,它不打算在生产代码中使用,因为它只是为了避免一些命令性的代码而进行大量循环:)