【问题标题】:convert a hashmap to an array [duplicate]将哈希图转换为数组[重复]
【发布时间】:2011-07-16 09:07:51
【问题描述】:

我有一个这样的哈希图:

HashMap<String, String[]> map = new HashMap<String, String[]>();

我想把它转换成一个数组,比如 Temp[],第一个值包含 hashmap 中的键,第二个值是 map 中的 String[]-array,也作为数组。这可能吗?怎么样?

【问题讨论】:

  • 您的问题不清楚 - 您是在谈论一个新类的数组,其中每个实例都包含地图中的键和值?

标签: java arrays hashmap


【解决方案1】:

看到同样的问题here:

hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

【讨论】:

  • 代码现在是这样的:` HashMap map = new HashMap(); map.put("key1", new String[]{"value1", "test1"}); map.put("key2", new String[]{"value2"}); Object[][] twoDarray = new String[map.size()][]; Object[] 键 = map.keySet().toArray();对象[] 值 = map.values().toArray(); System.out.println(值[1]); System.out.println(values[2]);` 输出损坏。回馈 [Ljava.lang.String;@1f33675 ​​线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 2 at test.main(test.java:17)
  • @tetsuya 您正在尝试访问 Values() HashSet 中支持的第三个元素,根据您的输入 不存在,因此您会得到 RuntimeException
  • @tetsuya 数组中的索引从 0 开始。因此,如果地图中有 2 个条目,则只能访问 values[0] 和 values[1]。
【解决方案2】:

嗯。你的问题真的很奇怪,但这是你问的:

HashMap<String, String[]> map = new HashMap<String, String[]>();
String[] keys = map.keySet().toArray();
Object[] result = new Object[keys.length*2]; //the array that should hold all the values as requested
for(int i = 0; i < keys.length; i++) {
  result[i] = keys[i]; //put the next key into the array
  result[i+1] = map.get(keys[i]); //put the next String[] in the array, according to the key.
}

但是,伙计,你为什么需要这样的东西?不管你想做什么,超过 99% 的机会你不需要写这样的东西......

【讨论】:

    【解决方案3】:

    我猜,你只需要写一个方法,就可以做你想做的事。

    【讨论】:

      【解决方案4】:

      我不确定这是否是您需要的,但这是我修改的代码:

          Map<String, String[]> map = new HashMap<String, String[]>();
          map.put("key1", new String[]{"value1", "test1"});
          map.put("key2", new String[]{"value2"});
      
          Object[] keys = map.keySet().toArray();
          Object[] values = map.values().toArray();
      
          System.out.println("key = " + keys[0] + ", value #1 = " + ((Object[])values[0])[0]);
          System.out.println("key = " + keys[1] + ", value #1 = " + ((Object[])values[1])[0] + ", value #2 = " + ((Object[])values[1])[1]);
      

      输出:

      key = key2, value #1 = value2
      key = key1, value #1 = value1, value #2 = test1
      

      请注意,在key[0] 下您有"key2" 而不是"key1"。那是因为HashMap 不会按照您添加它们的顺序保留密钥。要更改它,您必须选择另一个 Map 实现(例如 TreeMap,如果您想按字母顺序排列)。

      这是如何工作的? Java 允许您将数组转换为ObjecttoArray() 方法返回 Object[] - Objects 的数组,但这些对象也是数组(字符串 - 正如您在地图中定义的那样)!如果您只打印value[0],它就像打印mySampleArray,其中mySampleArray 是:

      Object[] mySampleArray = new Object[5];
      

      所以你在整个数组而不是元素上调用它。这就是为什么你会得到 [Ljava.lang.String;@7c6768 等(这是 className@HashCode - 这就是默认的 toString() 方法所做的)。

      为了了解你的元素,你必须更深入。

      ((Object[])values[0])[0]
      

      这意味着:取 values[0](我们知道它包含一个数组),将其转换为数组并取第一个元素。

      希望对您有所帮助,如果您需要任何其他信息,请告诉我。

      【讨论】:

        猜你喜欢
        • 2012-07-05
        • 2019-10-27
        • 2019-05-23
        • 2012-10-29
        • 2013-05-14
        • 1970-01-01
        • 1970-01-01
        • 2020-01-26
        • 2014-07-02
        相关资源
        最近更新 更多