【问题标题】:Inputting Arrays into a Hashmap将数组输入到 Hashmap
【发布时间】:2013-02-19 10:29:14
【问题描述】:

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

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

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    我无法想象

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

    可以提高效率。如果这是您经常要做的事情,那么我可能会在 Map 周围编写一个辅助对象。

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

    【讨论】:

    • 我想的也差不多。我知道 Map.putAll(),不幸的是我的值不在地图中。这就是为什么我希望数组存在 putAll() 的原因。不过还是谢谢。
    【解决方案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]);
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2017-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多