【问题标题】:How to Get Values from List of HashMap?如何从 HashMap 列表中获取值?
【发布时间】:2011-09-15 13:49:18
【问题描述】:

我有一个ListHashMapInteger 类型的键和Long 类型的值。

List<HashMap<Integer, Long>> ListofHash = new ArrayList<HashMap<Integer, Long>>();
        for (int i = 0; i < 10; i++) {
            HashMap<Integer, Long> mMap = new HashMap<Integer, Long>();
            mMap.put(Integer.valueOf(i), Long.valueOf(100000000000L+i));
            ListofHash.add(mMap);
        }

现在,如何从HashMap 列表中检索键和值?

如果使用Collection类是解决方案,请启发我。

更新 1:

实际上我是从数据库中获取值并将其放入 HashMap

public static List<Map<Integer, Long>> populateMyHashMapFromDB()
{

List<HashMap<Integer, Long>> ListofHash = new ArrayList<HashMap<Integer, Long>>();

for (int i = 0; i < 10; i++) {
                HashMap<Integer, Long> mMap = new HashMap<Integer, Long>();
                mMap.put(Integer.valueOf(getIntFromDB(i)), Long.valueOf(getLongFromDB(i)));
                ListofHash.add(mMap);
            }
return ListofHash;


}

其中 getIntFromDB 和 getLongFromDB 可以分别检索任何 int 和 long 值。

现在这是我想要从数据库中获取键和值的值的地方

public void getmyDataBaseValues()
{
List<HashMap<Integer,Long>> ListofHash=populateMyHashMapFromDB();

// This is where i got confused

}

回答这就是Peter Lawrey建议的原因

public class HashMaps {


    public static void main(String[] args) {
        // TODO Auto-generated method stub

        testPrintHashmapValues(putToHashMap());
        testPrintHashmapValuesWithList(putToHashMapWithList());
    }

    public static Map<Integer, Long> putToHashMap() {
        Map<Integer, Long> map = new LinkedHashMap<Integer, Long>();
        for (int i = 0; i < 10; i++) {
            map.put(Integer.valueOf(i), Long.valueOf(200000000000L + i));
        }
        return map;
    }

    public static void testPrintHashmapValues(Map<Integer, Long> map) {
        for (Map.Entry<Integer, Long> entry : map.entrySet()) {
            System.out.println("key: " + entry.getKey() + " value: "
                    + entry.getValue());
        }
    }

    public static List<Map<Integer, Long>> putToHashMapWithList() {
        List<Map<Integer, Long>> listOfHash = new ArrayList<Map<Integer, Long>>();
        for (int i = 0; i < 10; i++) {
            Map<Integer, Long> mMap = new HashMap<Integer, Long>();

            mMap.put(Integer.valueOf(i), Long.valueOf(100000000000L + i));
            listOfHash.add(mMap);
        }
        return listOfHash;
    }

    public static void testPrintHashmapValuesWithList(
            List<Map<Integer, Long>> listOfHash) {

        for (int i = 0; i < 10; i++) {
            Map<Integer, Long> map = listOfHash.get(i);
            for (Map.Entry<Integer, Long> entry : map.entrySet()) {
                System.out.println(i + " hashMap");
                System.out.println("key: " + entry.getKey() + " value: "
                        + entry.getValue());
            }
        }
    }

}

即使没有创建列表,我的任务也已完成。

【问题讨论】:

    标签: java collections map arraylist hashmap


    【解决方案1】:

    您遍历列表以获取地图,然后遍历其键集:

    public static void main(String[] args) throws NoSuchAlgorithmException {
      List<Map<Integer, Long>> ListofHash = new ArrayList<Map<Integer,Long>>();
      for (int i = 0; i < 10; i++) {
        Map<Integer, Long> mMap = new HashMap<Integer, Long>();
        mMap.put(Integer.valueOf(i), Long.valueOf(100000000000L + i));
        ListofHash.add(mMap);
      }
    
      for (Map<Integer, Long> map : ListofHash) {
        for (Integer key : map.keySet()) {
          System.out.println(map.get(key));       
        }
      }
    }
    

    注意:我还对您的代码进行了一些更改,尽可能使用 Map 而不是 HashMap

    【讨论】:

    • 进一步的改进是使用 google guava 声明列表: List> listOfHash = newArrayList();
    【解决方案2】:

    我假设你在问如何从 ArrayList 中获取它,

    ListofHash.get(0).get(Object key);
    

    对象键表示您想要的任何整数键

    祝你好运!

    【讨论】:

    • 这假设您要查找的内容在第一个 Map 中(并且存在第一个 Map)
    • @Peter,完全正确!我认为他的问题是关于如何访问这些元素的更笼统的问题。然而,迭代 ListofHash 将是一个更好的选择。
    • 在我看来他只需要一个long[10] 会简单得多。
    • 看来我必须知道获得正确值的密钥。但我也没有密钥,因为我从 DB 获得了这两个密钥。请看更新1。
    【解决方案3】:

    这种效果的东西:

    public static Long getValue(Integer key)) {
    
        for (HashMap<Integer, Long> entry : ListofHash) {
            if (entry.containsKey(key)) {
                return entry.get(key);
            }
        }
    
        return null;
    }
    
    //Retrieve all key/value
    for (HashMap<Integer, Long> entry : ListofHash) {
        for (Integer key : entry.keySet()) {
            System.out.println("Key : " + key + ", value: " + entry.get(key));
        }
    }
    

    PS未经测试。

    【讨论】:

      【解决方案4】:
      List<HashMap<Integer, Long>> ListofHash = new ArrayList<HashMap<Integer, Long>>();
              for (int i = 0; i < 10; i++) {
                  HashMap<Integer, Long> mMap = new HashMap<Integer, Long>();
                  mMap.put(Integer.valueOf(i), Long.valueOf(100000000000L+i));
                  ListofHash.add(mMap);
              }
      

      【讨论】:

        【解决方案5】:

        我仍然不清楚你为什么想要一个列表。

        public static Map<Integer, Long> populateMyHashMapFromDB() {
            Map<Integer, Long> map = new LinkedHashMap<Integer, Long>();
            for (int i = 0; i < 10; i++) 
                    map.put(getIntFromDB(i), getLongFromDB(i));
            return map;
        }
        
        Map<Integer, Long> map = populateMyHashMapFromDB();
        Long value = map.get(key);
        

        此集合并非旨在轻松为您提供键/值对。如果你需要这个功能,我建议使用不同的结构。

        假设您有一些无法更改的错误代码,您可以这样做

        List<Map<Integer, Long>> maps = new ArrayList<Map<Integer, Long>>();
        
        Map<Integer, Long> all = new HashMap<Integer, Long>();
        for(Map<Integer, Long> map: maps)
            all.putAll(map);
        
        for(Map.Entry<Integer, Long> entry: all.entrySet() {
            // do something which each key/value.
        }
        

        在此示例中,您不需要 List 或 Map。

        long[] longs = new long[10];
        for (int i = 0; i < 10; i++) 
            longs[i] = i;
        
        int key = 1;
        int num = longs[key];
        

        【讨论】:

        • 请问可以知道使用Map和HashMap有什么区别吗,之前的案例有什么复杂的??? (只是想知道)
        • Map 可以替换为任何 Map 实现。除非您需要使用仅在 HashMap 上可用的方法,否则最好使用接口。正如我在示例中向您展示的那样,使用 Map 列表比使用单个 Map 更复杂,不清楚为什么需要它们的列表。
        • 是的,我同意在示例中不需要哈希图,但在我的情况下,我从数据库中获取键和值,其中值不是增量的,我们也不知道值是什么。请参阅我的更新 1 代码。希望现在已经很清楚了。
        • @Adhavan,我已经更新了我的答案。也许您正试图让事情变得比实际需要的更复杂。
        • 是的......你是对的......我只是和列表混淆......它可以单独使用 HashMap 来完成......
        【解决方案6】:

        您总共有 10 个地图,其中只存储了一个元素。这些地图存储在一个列表中。您可以通过以下方式检索这些地图及其元素:

        public void testPrintHashmapValues()  {
            List<HashMap<Integer, Long>> listOfHash = new ArrayList<HashMap<Integer, Long>>();
            for (int i = 0; i < 10; i++) {
                HashMap<Integer, Long> mMap = new HashMap<Integer, Long>();
                mMap.put(Integer.valueOf(i), Long.valueOf(100000000000L+i));
                listOfHash.add(mMap);
            }
        
            for (int i = 0; i < 10; i++) {
                Map<Integer, Long> map = listOfHash.get(i);
                for (Map.Entry<Integer, Long> entry : map.entrySet()) {
                    System.out.println(i + " hashMap");
                    System.out.println("key: " + entry.getKey() + " value: " + entry.getValue());
                }
            }
        
        }
        

        此外,变量不应以大写 (ListOfHash) 开头。尽管 java 不会抱怨,但它是一种不好的做法,并且难以阅读这样的代码,因为人们可能会认为它是类名而不是变量。

        【讨论】:

        • 嘿嘿....对不起!!!!只是觉得打字后懒得换...你发现了谢谢!!!! ;)
        猜你喜欢
        • 1970-01-01
        • 2015-09-09
        • 2013-08-03
        • 2020-04-16
        • 2010-11-25
        • 2014-06-14
        • 2013-04-21
        • 1970-01-01
        相关资源
        最近更新 更多