5

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

可以在 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]);
}
4

5 回答 5

5

我无法想象

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

可以变得更有效率。如果这是您经常要做的事情,那么我可能会在Map.

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

于 2013-02-19T10:31:02.610 回答
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]);
}
于 2013-02-19T10:33:32.157 回答
0

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

for (int i=0; i < keys.length; i++) {
    map.put(keys[i],values[i]);
}
于 2013-02-19T10:31:35.257 回答
0

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

于 2013-02-19T10:40:56.877 回答
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。我喜欢创建这种结构只是为了好玩,它不打算在生产代码中使用,因为它会产生很多循环只是为了避免一些命令式代码:)

于 2013-02-19T10:57:35.047 回答