【问题标题】:Retrieve all values from HashMap keys in an ArrayList Java从 ArrayList Java 中的 HashMap 键中检索所有值
【发布时间】:2012-10-09 05:49:19
【问题描述】:

美好的一天,这让我有点困惑(大脑冻结!)并且似乎遗漏了一些东西。有一个我用 HashMap 填充的 ArrayList。现在我放入我的 HashMap 和 arraylist。

 Map.put(DATE, value1);
 Map.put(VALUE, value2);

 arraylist.put(Map);

由于解析 JSON,arraylist 的大小显着增加。现在我的问题是如何从数组列表中的两个映射键中获取值?这个我试过了

  if(!list.isEmpty()){   // list is an ArrayList

            for(int k = 0; k < list.size(); k++){
                map = (HashMap)list.get(k);
            }

        }

        Log.d(TAG, "map size is" + map.size());

        String [] keys = new String[map.size()];
        String [] date_value = new String[map.size()];

        String [] value_values = new String[map.size()];

        int i = 0;
        Set entries = map.entrySet();
        Iterator iterator = entries.iterator();

        while(iterator.hasNext()){

            Map.Entry mapping = (Map.Entry)iterator.next();
            keys[i] = mapping.getKey().toString(); 
            date_value[i] = map.get(keys[i]);

            if(keys[i].equals(DATE)){
                date_value[i] = map.get(keys[i]);

            } else if(keys[i].equals(VALUE)){
                value_values[i] = map.get(keys[i]);
            }

                   i++;
                 }

但我似乎无法获得所有值。 Map 大小总是返回 2 的值,这只是元素。如何从 ArrayList 中的 Map 键中获取所有值?谢谢

【问题讨论】:

  • 如果您想要两个地图中的密钥,您将需要实际从两个地图中获取密钥。您的代码只是从列表中的最后一个地图中获取键。

标签: java arraylist hashmap


【解决方案1】:

创建一个String 类型的ArrayList 来保存映射的值。在其构造函数中调用 Map 类的方法values()

Map <String, Object> map;
List<Object> list = new ArrayList<Object>(map.values());

【讨论】:

    【解决方案2】:

    它具有从地图中查找所有值的方法:

    Map<K, V> map=getMapObjectFromXyz();
    Collection<V> vs= map.values();
         
    

    遍历vs做一些操作

    【讨论】:

      【解决方案3】:

      List 构造函数接受任何实现了 Collection 接口的数据结构,用于构建列表。

      要从哈希映射中获取所有 到列表:

      Map<String, Integer> map = new HashMap<String, Integer>();
      List<String> keys = new ArrayList<>(map.keySet());
      

      从哈希映射中获取所有到列表:

      Map<String, Integer> map = new HashMap<String, Integer>();
      List<Integer> values = new ArrayList<>(map.values());
      

      【讨论】:

      • 这是我看到的这个问题的最佳答案!直奔主题。
      【解决方案4】:

      Java 8 解决方案用于生成像“key1: value1,key2: value2”这样的字符串

      private static String hashMapToString(HashMap<String, String> hashMap) {
      
          return hashMap.keySet().stream()
                  .map((key) -> key + ": " + hashMap.get(key))
                  .collect(Collectors.joining(","));
      
      }
      

      并生成一个简单的列表作为列表收集

      private static List<String> hashMapToList(HashMap<String, String> hashMap) {
      
          return hashMap.keySet().stream()
                  .map((key) -> key + ": " + hashMap.get(key))
                  .collect(Collectors.toList());
      
      }
      

      【讨论】:

        【解决方案5】:

        假设我有键数据类型为 KeyDataType 的 Hashmap 并将值数据类型作为 ValueDataType

        HashMap<KeyDataType,ValueDataType> list;
        

        添加您需要的所有项目。 现在您可以将所有 hashmap 键检索到列表中。

        KeyDataType[] mKeys;
        mKeys=list.keySet().toArray(new KeyDataType[list.size()]);
        

        所以,现在你在数组 mkeys[] 中获得了所有键

        您现在可以通过调用检索任何值

         list.get(mkeys[position]);
        

        【讨论】:

          【解决方案6】:

          既然已经有工作要做,为什么还要重新发明轮子。 Map.keySet() 方法为您提供 Map 中所有键的 Set。

          Map<String, Integer> map = new HashMap<String, Integer>();
          
          for (String key: map.keySet()) {
              System.out.println("key : " + key);
              System.out.println("value : " + map.get(key));
          }
          

          另外,你的第一个 for 循环在我看来很奇怪:-

             for(int k = 0; k < list.size(); k++){
                      map = (HashMap)list.get(k);
             }
          

          您正在遍历您的列表,并将每个元素分配给相同的 reference - map,这将覆盖所有以前的值。您将拥有的只是列表中的最后一张地图。

          编辑:-

          如果您想要地图的键和值,您也可以使用entrySet。那对你来说会更好:-

              Map<String, Integer> map = new HashMap<String, Integer>();
          
              for(Entry<String, Integer> entry: map.entrySet()) {
                  System.out.println(entry.getKey());
                  System.out.println(entry.getValue());
              }
          

          附言:-
          你的代码在我看来很混乱。我建议,把那段代码放在一边,再想想你的design。目前,就代码而言,很难理解它试图做什么。

          【讨论】:

          • 如果循环中的代码调用getentrySet 是迭代映射中元素的更好方法
          • @RohitJain 很抱歉这么晚才回复,发布问题后没有机会。我想做的是从地图中获取所有值。正如我在帖子中所说,Hashmap 有 2 个键,它们通过 JSON 解析填充,然后添加到 ArrayList。我想检索 HashMap 中 2 个键的所有值,它位于 ArrayList 内。是的,我知道第一个“for”循环看起来很奇怪。但我试图获取 Arraylist 中的所有值,因为 Hashmap 只返回 2 个值的大小,并且 ArrayList 中有更多值。
          • @RohitJain 如果您在答案的上半部分显示解释“entrySet”的部分,而不是讨论“keySet”的部分,则效果会更好。只需交换部分的顺序即可。
          【解决方案7】:

          这是非常古老的,但我偶然发现它试图找到另一个问题的答案。

          我的问题是如何从数组列表中的两个映射键中获取值?

          for (String key : map.keyset()) {
            list.add(key + "|" + map.get(key));
          }
          

          地图大小总是返回值 2,这只是元素

          我想你可能对HashMap 的功能感到困惑。 HashMap 只允许地图中的 1 对 1 关系。

          例如,如果您有:

          String TAG_FOO = "FOO";
          String TAG_BAR = "BAR";
          

          并尝试做这样的事情:

          ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR");
          HashMap<String,String> map = new HashMap<>();
          for (String bar : bars) {
            map.put(TAG_BAR, bar);
          }
          

          此代码最终会将键条目 "BAR" 设置为与列表中的最后一个项目 bars 相关联。

          在您的示例中,您似乎对只有两个项目感到困惑,但您只记录了两个键,这使我相信您只是多次覆盖了每个键的字段。

          【讨论】:

            【解决方案8】:

            试试这个方法...

            我正在考虑 HashMapkeyvalue 类型为 String, HashMap&lt;String,String&gt;

            HashMap<String,String> hmap = new HashMap<String,String>();
            
            hmap.put("key1","Val1");
            hmap.put("key2","Val2");
            
            ArrayList<String> arList = new ArrayList<String>();
            
            for(Map.Entry<String,String> map : hmap.entrySet()){
            
                 arList.add(map.getValue());
            
            }
            

            【讨论】:

            • 是的,现在很好。但是为什么要将所有地图值添加到列表中?真的需要吗?我觉得不行。任何时候你想要一个值,你都可以从 Map 本身中获取它。暂时还不清楚 OP 想要做什么。
            • @RohitJain 我已经在 ArrayList 中添加了值,因为 OP 想要这样......这就是问题的标题所说的......
            • @KumarVivekMitra .. 是的,根据 OP 的要求,这是正确的,但由于这不是正确的编码方式,您可以更好地添加一些建议。我只是为了改进这篇文章。 :)
            • @RohitJain 我可以,但是我们应该知道程序员想用这些数据做什么......因为我不太清楚他想用这些数据做什么......我是暂时没有任何建议...
            • @KumarVivekMitra .. 嗯。是的,那部分也是正确的。干杯:)
            【解决方案9】:

            将 i++ 放在循环末尾的某处。

            在上面的代码中,数组的0位置被覆盖了,因为i没有在每次循环中递增。

            仅供参考:以下内容进行了冗余搜索:

            if(keys[i].equals(DATE)){                 
               date_value[i] = map.get(keys[i]);              
            } else if(keys[i].equals(VALUE)){              
               value_values[i] = map.get(keys[i]);             
            } 
            

            替换为

            if(keys[i].equals(DATE)){                 
               date_value[i] = mapping.getValue();
            } else if(keys[i].equals(VALUE)){              
               value_values[i] = mapping.getValue()
            } 
            

            另一个问题是您将i 用于date_valuevalue_values。除非您打算在数组中包含空值,否则这是无效的。

            【讨论】:

            • 反对者愿意发表评论吗?在上面的代码中,数组的0位置被覆盖,因为i没有递增。
            • 他没有在声明 i 的地方发布代码。如果它在一个 for 循环中,它可能已经被递增了。你不知道“i”是怎么回事,因为他没有发布任何关于“i”的信息。
            • @toadzky 请重新检查帖子。寻找int i = 0;。他确实发布了声明 i 的代码。
            • @JohnB 对我迟到的回复感到抱歉。但是我的值 i 增加了。我没有意识到我没有复制它。现在将编辑我的代码。
            猜你喜欢
            • 2016-12-30
            • 1970-01-01
            • 1970-01-01
            • 2013-11-01
            • 2023-04-08
            • 2014-03-15
            • 2012-06-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多