使用ArrayLists创建HashMap

时间:2013-04-16 17:18:17

标签: java

我正在制作项目经理计划(非常简单)。基本上有CoWorkers和他们的任务。现在,我做了以下结构:我使用HashMap键作为CoWorkers的名称,值总是CoWorkers ArryList,当然包含他或她的工作。

我的问题是我可以创建这个结构但是当我尝试添加一个ArrayLists的任务时,我总是将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 void addJob(String name, String job){
    try{
        List<String> itemsList = jobs.get(name);
    itemsList.add(job);
    }catch(Exception ex){
         System.err.println(ex.getMessage() + jobs.get(name) +name);
    }
}

我正在调用这种方法:

addjob("George","Clean up your room!");

控制台上的结果将是:

  

nullnullGeorge

更新

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;
}

更新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");
    }
}

3 个答案:

答案 0 :(得分:2)

查看代码ex.getMessage()+ jobs.get(name)+ name,当控制台打印出nullnullGeorge时,你必须得到空指针异常 它表示List itemsList = jobs.get(name); //这是null,因此是列表。 向List添加null将给出空指针Exception。这意味着在Map中添加George时,没有发生。

答案 1 :(得分:1)

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

我不认为你在这里向我们展示了一切。

我认为在某个地方你有两个变量“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;
    }

我怀疑你从文件中读到的内容与“乔治”不匹配,即使我们还不能理解为什么。一旦我们对列表处理有信心,那么我们就可以考虑数据了。

答案 2 :(得分:1)

一般情况下,如果您要操作该值,最好检查一下您的地图是否包含一个键。例如:

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);
}

另一个问题是,当您找不到某人的工作时,您会无声地失败。请考虑将其添加到createJobs()

    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>());
        }
    }