【问题标题】:Converting HashMap into Array将 HashMap 转换为数组
【发布时间】:2012-05-26 09:17:58
【问题描述】:

我有一个 HashMap,我想将它转换成一个数组。 下面的代码,我得到以下内容: [[2, 11, 10, 9], [value1, value2, value3, value4], [null, null, null, null], [null, null, null, null]] “空”条目给了我一个空指针异常。为什么它是应有的两倍大?我只想要真正的条目: [[2, 11, 10, 9], [value1, value2, value3, value4]]。我做错了什么?

String[][] test = getArrayFromHash(hashmap);

    public static String[][] getArrayFromHash(HashMap<String, String> hashMap){
        String[][] str = null;
        {
            Object[] keys = hashMap.keySet().toArray();
            Object[] values = hashMap.values().toArray();
            str = new String[keys.length][values.length];
            for(int i=0;i<keys.length;i++) {
                str[0][i] = (String)keys[i];
                str[1][i] = (String)values[i];
            }
        }
        return str;
    }

谢谢!

【问题讨论】:

    标签: java android


    【解决方案1】:

    参考这个link:::

        String[][] arr = new String[hashmap.size()][2];
        Set entries = hashmap.entrySet();
        Iterator entriesIterator = entries.iterator();
    
        int i = 0;
        while(entriesIterator.hasNext()){
    
            Map.Entry mapping = (Map.Entry) entriesIterator.next();
    
            arr[i][0] = mapping.getKey().toString();
            arr[i][1] = mapping.getValue().toString();
    
            i++;
        }
    

    UPdated:::: 得到两个一维数组

    String[] arr1 = new String[hashmap.size()];
    String[] arr2 = new String[hashmap.size()];
            Set entries = hashmap.entrySet();
            Iterator entriesIterator = entries.iterator();
    
            int i = 0;
            while(entriesIterator.hasNext()){
    
                Map.Entry mapping = (Map.Entry) entriesIterator.next();
    
                arr1[i] = mapping.getKey().toString();
                arr2[i] = mapping.getValue().toString();
    
                i++;
            }
    

    【讨论】:

    • 非常感谢!如何从这些 Objekts 制作字符串?我想将所有值放入 Spinner,因此我需要字符串。
    • 我得到这个异常:05-26 14:02:27.473: W/System.err(22784): java.lang.ClassCastException: [[Ljava.lang.Object;
    • 你能发布完整的 logcat 吗?
    • mapping.getKey().toString();替换为 mapping.getKey();并尝试
    • 错误是从二维数组转换为一维数组。这是代码: for(int i = 0, k = 0; i
    【解决方案2】:

    分配适当大小的数组

    str = new String[2][values.length];
    

    此外,您应该断言值和键具有相同的长度。并且匹配的条目出现在相同的位置。类似的东西

    String[] keys = hashMap.keySet().toArray(new String[0]);
    String[] values = new String[keys.length];
    String[][] str = {keys, values};
    for(int i=0;i<keys.length;i++) values[i] = hashMap.get(keys[i]);
    return str;
    

    应该可以(未测试)。

    【讨论】:

    • 简短,简洁,看起来对我有用。万一您没有看到我的上一条评论,我删除了我的答案。我意识到 Sets 不保持秩序,并且不确定我是否可以转换为 LinkedHashSet 并在转换之前保持秩序。我看到你在这里通过使用键数组中的键从地图本身获取实际值来解决这个问题。非常聪明。 +1
    • 谢谢。使用EntrySet 可能会更快。它有创建Map.Entry 的开销,但消除了查找。
    【解决方案3】:

    我不确定 keyset 和 values 是否需要以相同的顺序返回值(在实现文档中没有指定,所以我说不能保证)。

    尝试使用入口集:

    Set<Map.Entry<String, String>> set = hm.entrySet();
    int i = 0;
    for (Map.Entry<String,String> me : set) {
      arr[i][0] = me.getKey();
      arr[i][1] = me.getValue()};
      i++;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-13
      • 2010-11-08
      • 2018-10-23
      • 2019-12-06
      • 2019-02-17
      • 2012-06-02
      • 2012-08-18
      • 1970-01-01
      相关资源
      最近更新 更多