2013-02-19 44 views
3

我觉得这是一个非常简单的问题,但我找不到答案。将数组输入到散列图中

你可以输入一个数组对象到HashMap的put方法吗?

例子:

假设你有一个HashMap:
​​

你有一个整数数组和方便给出一个字符串数组。数组未被初始化,如下所示,但包含未知值(这只是用于说明结果)。

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]); 
} 

回答

3

我无法想象

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

可以更有效的制造。如果这是你经常要做的事情,那么我可能会在Map周围写一个帮助对象。

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

+0

我想到了很多。我知道Map.putAll(),不幸的是我的值不在地图中。这就是为什么我希望putAll()会存在于数组中。不过谢谢。 – Matt 2013-02-19 11:00:28

0

如果您需要这种行为,那么您确实需要解析每个元素以将它们放入HashMap中。最坏情况下的复杂度将是O(n)并且您不能减少这种情况。你需要触摸的所有元素来填充的HashMap
下面的代码(正如你所提到的)是唯一的变通

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

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

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]); 
} 
0

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

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不是最performatic解决方案,但它的凉爽阅读它:)

无论如何,更喜欢旧的for。我喜欢创造这种类型的结构只是为了好玩,它并不打算用于生产代码,因为它使得很多循环只是为了避免一点必要的代码:)