使用嵌套地图

时间:2019-07-15 06:42:20

标签: collections salesforce apex

嘿,当我尝试使用嵌套地图时,我正在使用嵌套地图,因此我初始化了此地图>>。我需要通过关键行业的帐户,并且需要按行业显示帐户数和帐户组

我尝试投入价值,但显示null pointer exception

顶点类

public class Map_Practice_Show_Account_industry {
    public static void mapindustry(){
        Map<String,Map<Integer,List<Account>>> m = new Map<String,Map<Integer,List<Account>>>();

        List<Account> lstacc = [SELECT Id, Name, Industry FROM Account WHERE industry != Null ];
        for(Account acc : lstacc){
            List<Account> lstacc1 = new List<Account>();
            lstacc1.add(acc);
            if(m.containsKey(acc.Industry)){
                m.get(acc.Industry).put(m.get(acc.Industry).size(),lstacc1);

            } else {
                Map<Integer, List<Account>> macc=new  Map<Integer, List<Account>>();
                macc.put(m.get(acc.Industry).size(),new List<Account>{acc});
                m.put(acc.Industry, macc);

            }
        }
        System.debug('@@@@ : '+ m.get('Agriculture'));
    }
}

我需要显示像农业这样的结果作为键,并以整数2及其帐户名称显示

2 个答案:

答案 0 :(得分:0)

您的错误在您其他部分的第二行(跟随错误的指针)

public class Map_Practice_Show_Account_industry {
    public static void mapindustry(){
        Map<String,Map<Integer,List<Account>>> m = new Map<String,Map<Integer,List<Account>>>();

        List<Account> lstacc = [SELECT Id, Name, Industry FROM Account WHERE industry != Null ];
        for(Account acc : lstacc){
            List<Account> lstacc1 = new List<Account>();
            lstacc1.add(acc);
            if(m.containsKey(acc.Industry)){
                m.get(acc.Industry).put(m.get(acc.Industry).size(),lstacc1);

            } else {
                Map<Integer, List<Account>> macc=new  Map<Integer, List<Account>>();
                -->macc.put(m.get(acc.Industry).size(),new List<Account>{acc});
                m.put(acc.Industry, macc);

            }
        }
        System.debug('@@@@ : '+ m.get('Agriculture'));
    }
}

在某些情况下,您正在检查地图是否包含密钥acc.Industry,但在其他部分中,即使地图中不存在密钥,您仍在尝试访问它,因此返回null。在空对象上调用size()方法将导致空指针异常。

编辑:-

  

那我想要的结果将是什么?   能够获得无帐户数的大小

我认为您不必要地使此代码复杂化。据我从您的问题陈述中所了解的,您只需要一个Map<String, List<Account>>,其中以行业为关键,而相关的帐户列表为值。您可以通过获取特定行业的帐户列表,然后在该列表上调用size方法来获取特定行业的帐户大小。这是此方案的代码

public class AccountUtils {

    //Get all accounts with Industry as key and List of Accounts as Value
    public static Map<String,List<Account>> getAccountsGroupedByIndustryMap(){
        Map<String,List<Account>> accountsGroupedByIndustry = new Map<String,List<Account>>();
        //Fetch all accounts with Industry
        List<Account> accountsWithIndustry = [SELECT Id, Name, Industry FROM Account WHERE Industry <> NULL];

        for(Account acc : accountsWithIndustry){
            List<Account> accountList;
            //Check if map already contains current Industry as key
            if(accountsGroupedByIndustry.containsKey(acc.Industry)){
                //Fetch existing list, add new value and put it back in map
                accountList = accountsGroupedByIndustry.get(acc.Industry);
                accountList.add(acc);

            } else {//If key doesn't exist, create a new list and add account value
                accountList = new List<Account>();
                accountList.add(acc);
            }
            //Finally put this list in the map with Industry as key
            accountsGroupedByIndustry.put(acc.Industry,accountList);
        }
        return accountsGroupedByIndustry;
    }
}

答案 1 :(得分:0)

从我的手机上发布此内容不确定是否有人可以编辑:)

就像上面指出的那样,您的错误出现在else语句的第二行。您试图在插入行业类型之前获取行业密钥所指向的大小。获取不存在的键将返回空值,而您正在尝试获取空值的size()。

因此请问您一个问题:只需将密钥硬编码为零,因为它是第一个元素。

之前

 macc.put(m.get(acc.Industry).size(),new List<Account>{acc});

之后

 macc.put(0,new List<Account>{acc});