Java 使用ArrayList创建HashMap

Java 使用ArrayList创建HashMap,java,Java,我正在制作一个项目经理程序(一个非常简单的程序)。基本上有同事和他们的任务。现在,我创建了以下结构:我使用HashMap键作为同事的名称,值始终是CoWorkersArryList,其中当然包含他或她的工作 我的问题是我可以创建这个结构,但是当我尝试将一个任务添加到其中一个ArrayList时,我总是得到null作为返回值 以下是我的代码片段: HashMap<String, ArrayList<String>> jobs = new HashMap<String,

我正在制作一个项目经理程序(一个非常简单的程序)。基本上有同事和他们的任务。现在,我创建了以下结构:我使用
HashMap
键作为同事的名称,值始终是CoWorkers
ArryList
,其中当然包含他或她的工作

我的问题是我可以创建这个结构,但是当我尝试将一个任务添加到其中一个ArrayList时,我总是得到
null
作为返回值

以下是我的代码片段:

HashMap<String, ArrayList<String>> jobs = new HashMap<String, ArrayList<String>>();

public void createJobs(){
    nameReader();
    for(String name:names){
        File f = new File(name+"_job.txt");
        if(f.exists()){
            jobs.put(name, jobReader(name));
        }
    }
    Set set = jobs.entrySet(); 
    Iterator i = set.iterator(); 
    while(i.hasNext()) { 
        Map.Entry me = (Map.Entry)i.next(); 
        System.out.print(me.getKey() + ": "); 
        System.out.println(me.getValue()); 
    } 
}
控制台上的结果将是:

乔治

更新

public ArrayList jobReader(String name){
    ArrayList<String> tasks = new ArrayList<String>();
    try{
        Scanner s = new Scanner(new File(name+"_job.txt"));
        while (s.hasNext()){
            tasks.add(s.next());
        }
        s.close();
    }catch(IOException ioe){
        System.err.println("IOException: " + ioe.getMessage());
    }
    return tasks;
}
publicArrayList作业读取器(字符串名称){
ArrayList tasks=新建ArrayList();
试一试{
扫描器s=新扫描器(新文件(名称+“_job.txt”);
而(s.hasNext()){
添加(s.next());
}
s、 close();
}捕获(ioe异常ioe){
System.err.println(“IOException:+ioe.getMessage());
}
返回任务;
}
更新2

这是我的洞码:

public class CoWorkers {
    HashMap<String, ArrayList<String>> jobs = new HashMap<String, ArrayList<String>>();
    ArrayList<String> names = new ArrayList<String>();

    public void createJobs(){
        nameReader();
        for(String name:names){
            File f = new File(name+"_job.txt");
            if(f.exists()){
                jobs.put(name, jobReader(name));
            }
        }
        Set set = jobs.entrySet(); 
        Iterator i = set.iterator(); 
        while(i.hasNext()) { 
            Map.Entry me = (Map.Entry)i.next(); 
            System.out.print(me.getKey() + ": "); 
            System.out.println(me.getValue()); 
        } 
    }

    public void addName(String name){
        try{
            String filename= "Names.txt";
            FileWriter fw = new FileWriter(filename,true); 
            fw.write(name+"\n");
            fw.close();
        }
        catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
        }
    }

    public void addJob(String name, String job){
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        Date date = new Date();
        try{
            List<String> itemsList = jobs.get(name);
            itemsList.add(job);
        }catch(Exception ex){
             ex.printStackTrace();
        }
    }

    public ArrayList jobReader(String name){
        ArrayList<String> tasks = new ArrayList<String>();
        try{
            Scanner s = new Scanner(new File(name+"_job.txt"));
            while (s.hasNext()){
                tasks.add(s.next());
            }
            s.close();
        }catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
        }
        return tasks;
    }

    public void nameReader(){
        names.clear();
        try{
            Scanner s = new Scanner(new File("Names.txt"));
            while (s.hasNext()){
                names.add(s.next());
            }
            s.close();
        }catch(IOException ioe){
            System.err.println("IOException: " + ioe.getMessage());
        }
    }
    public static void main(String[] args) {
        CoWorkers project = new CoWorkers();
        project.createJobs();
        project.addJob("George","Do the laundry");
    }
}
公共类同事{
HashMap作业=新建HashMap();
ArrayList name=新的ArrayList();
public void createJobs(){
姓名阅读器();
for(字符串名称:名称){
文件f=新文件(名称+“_job.txt”);
如果(f.exists()){
jobs.put(名称,jobReader(名称));
}
}
Set=jobs.entrySet();
迭代器i=set.Iterator();
而(i.hasNext()){
Map.Entry me=(Map.Entry)i.next();
System.out.print(me.getKey()+“:”);
System.out.println(me.getValue());
} 
}
public void addName(字符串名称){
试一试{
字符串filename=“Names.txt”;
FileWriter fw=新的FileWriter(文件名,true);
fw.写入(名称+“\n”);
fw.close();
}
捕获(ioe异常ioe){
System.err.println(“IOException:+ioe.getMessage());
}
}
公共void addJob(字符串名称、字符串作业){
DateFormat DateFormat=新的简化格式(“yyyy/MM/dd HH:MM:ss”);
日期=新日期();
试一试{
List itemsList=jobs.get(name);
itemsList.add(作业);
}捕获(例外情况除外){
例如printStackTrace();
}
}
公共ArrayList作业读取器(字符串名称){
ArrayList tasks=新建ArrayList();
试一试{
扫描器s=新扫描器(新文件(名称+“_job.txt”);
而(s.hasNext()){
添加(s.next());
}
s、 close();
}捕获(ioe异常ioe){
System.err.println(“IOException:+ioe.getMessage());
}
返回任务;
}
公共void名称读取器(){
name.clear();
试一试{
扫描仪s=新扫描仪(新文件(“Names.txt”);
而(s.hasNext()){
name.add(s.next());
}
s、 close();
}捕获(ioe异常ioe){
System.err.println(“IOException:+ioe.getMessage());
}
}
公共静态void main(字符串[]args){
同事项目=新同事();
project.createJobs();
project.addJob(“乔治”,“洗衣服”);
}
}

查看诸如.getMessage()+jobs.get(name)+name之类的代码,当控制台打印null时,您必须获得null指针异常 它的意思是List itemsList=jobs.get(name)//这是空的,因此是列表。
将null添加到列表将导致u null指针异常。这意味着在映射中添加George时,不会发生此情况

查看代码ex.getMessage()+jobs.get(name)+name,当控制台打印null时,您必须获得null指针异常 它的意思是List itemsList=jobs.get(name)//这是空的,因此是列表。
将null添加到列表将导致u null指针异常。这意味着在映射中添加George时,不会发生此情况

所以我创建了自己的小测试类,并证明了您的代码是有效的

我不认为你把这里的一切都给我们看

我想你对变量“jobs”有两个定义,一个是隐藏另一个

------更新------

好的,我用硬编码的名字和作业运行你的代码,它运行得很好。我的建议是:尝试做同样的事情

       String names[] = {"George", "Bill"};
        for(String name:names){          
             jobs.put(name, jobReader(name));              
        }

       public ArrayList jobReader(String name){
        ArrayList<String> tasks = new ArrayList<String>();
                tasks.add("Tidy");
            return tasks;
    }
字符串名[]={“乔治”,“比尔”};
对于(字符串名称:名称){
jobs.put(名称,jobReader(名称));
}
公共ArrayList作业读取器(字符串名称){
ArrayList tasks=新建ArrayList();
任务。添加(“整理”);
返回任务;
}

我怀疑你从文件中读到的与“George”不匹配,尽管我们还不知道为什么。一旦我们对列表处理有了信心,我们就可以考虑数据了。

所以我创建了自己的小测试类,并证明了您的代码是有效的

我不认为你把这里的一切都给我们看

我想你对变量“jobs”有两个定义,一个是隐藏另一个

------更新------

好的,我用硬编码的名字和作业运行你的代码,它运行得很好。我的建议是:尝试做同样的事情

       String names[] = {"George", "Bill"};
        for(String name:names){          
             jobs.put(name, jobReader(name));              
        }

       public ArrayList jobReader(String name){
        ArrayList<String> tasks = new ArrayList<String>();
                tasks.add("Tidy");
            return tasks;
    }
字符串名[]={“乔治”,“比尔”};
对于(字符串名称:名称){
jobs.put(名称,jobReader(名称));
}
公共ArrayList作业读取器(字符串名称){
ArrayList tasks=新建ArrayList();
任务。添加(“整理”);
返回任务;
}

我怀疑你从文件中读到的与“George”不匹配,尽管我们还不知道为什么。一旦我们对列表处理有了信心,我们就可以考虑数据了。

一般来说,如果要处理值,最好检查地图是否包含键。例如:

public void addJob(String name, String job){

    if (!jobs.containsKey(name)) {
        jobs.put(name, new ArrayList<String>());
    }
    List<String> itemsList = jobs.get(name);
    itemsList.add(job);
}

一般来说,如果你要去b,最好检查你的地图是否包含一个键
public void addJob(String name, String job){

    if (!jobs.containsKey(name)) {
        jobs.put(name, new ArrayList<String>());
    }
    List<String> itemsList = jobs.get(name);
    itemsList.add(job);
}
    for(String name:names){
        File f = new File(name+"_job.txt");
        if(f.exists()){
            jobs.put(name, jobReader(name));
        } else { // This is new
            jobs.put(name, new ArrayList<String>());
        }
    }