嘿,当我尝试使用嵌套地图时,我正在使用嵌套地图,因此我初始化了此地图>>。我需要通过关键行业的帐户,并且需要按行业显示帐户数和帐户组
我尝试投入价值,但显示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及其帐户名称显示
答案 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});