迭代Hashmap的内容并将它们分成类别

时间:2014-05-03 17:38:16

标签: java sorting hashmap

我有这样的代码,截至目前有hashmap employee类型为<String,Integer>,其中 String包含部门的名称in which an employee works and整数包含该员工的年龄I want to divide the employees age into different age categories(like 0-20,20-40 and so on) for each department。我现在的代码是这样的:

       public void Employeeage()
{         
                categoryModel = new CartesianChartModel(); 




                QueryBean obj = new QueryBean();

                Map<String, Integer> employee = obj.getEmployeeAge();

                System.out.println("After accessing QueryBean");

                // 7 groups for age categories

                ArrayList<Integer> grp1 = new ArrayList<Integer>();
                ArrayList<Integer> grp2 = new ArrayList<Integer>();
                ArrayList<Integer> grp3 = new ArrayList<Integer>();
                ArrayList<Integer> grp4 = new ArrayList<Integer>();
                ArrayList<Integer> grp5 = new ArrayList<Integer>();
                ArrayList<Integer> grp6 = new ArrayList<Integer>();
                ArrayList<Integer> grp7 = new ArrayList<Integer>();

                // for each department s, I want to divide employees into different age catgorie
                for(String s: employee.keySet())
                {
                for(Integer i : employee.get(s))   // Error thrown here that cannot iterate over here
                    {
                    System.out.println("Employee age is :"+ i); 
                    if(i.intValue() > 0 && i.intValue() <= 20 )
                        {
                        grp1.add(i);
                        }
                    else if(i.intValue() > 20  && i.intValue() <= 40 )
                        {
                        grp2.add(i);
                        }
                    else if(i.intValue() > 40 && i.intValue() <= 50 )
                        {
                        grp3.add(i);
                        }
                    else if(i.intValue() > 50 && i.intValue() <= 60 )
                        {
                        grp4.add(i);
                        }
                    else if(i.intValue() > 60 && i.intValue() <= 70 )
                        {
                        grp5.add(i);
                        }
                    else if(i.intValue() > 70 && i.intValue() <= 80 )
                        {
                        grp6.add(i);
                        }
                    else if(i.intValue() > 80) 
                        {
                        grp7.add(i);
                        }
                    }

                int size1 = grp1.size();
                System.out.println("Size 1 value"+size1);
                int size2 = grp2.size();
                System.out.println("Size 2 value"+size2);
                int size3 = grp3.size();
                System.out.println("Size 3 value"+size3);
                int size4 = grp4.size();
                System.out.println("Size 4 value"+size4);
                int size5 = grp5.size();
                System.out.println("Size 5 value"+size5);
                int size6 = grp6.size();
                System.out.println("Size 6 value"+size6);
                int size7 = grp7.size();
                System.out.println("Size 7 value"+size7);
                System.out.print("After inserting into groups");
                ChartSeries emp = new ChartSeries();  

                emp.setLabel("Employees");  

                emp.set("0-20", size1);  
                emp.set("21-40", size2);  
                emp.set("41-50", size3);  
                emp.set("51-60", size4);  
                emp.set("61-70", size5);  
                emp.set("71-80", size6);
                emp.set("80+", size7);

                categoryModel.addSeries(emp);  

            }
}

上面的代码在其逻辑中并不完整,因为我无法找到一种方法。 如何将员工划分为每个部门的不同年龄类别?

更新:我认为我在解释中并不清楚,但我想要的是将员工划分为每个部门的不同年龄类别的方法。我没有提到代码区外的for循环错误,因为这不是我的主要问题。对不起,不太清楚

1 个答案:

答案 0 :(得分:0)

你在问自己的问题时并不是很清楚(事实证明我试图在这里解决错误的问题),但看起来你有点误用了那里的第二个for循环。

 for(String s: employee.keySet()){
     for(Integer i : employee.get(s)) 
         ...

第一个for循环是正确的,尽管效率不高。问题出在第二个for循环:

for(Integer i : employee.get(s))

如果查看在线javadoc,您会看到get()返回与您传入的密钥对应的值。因此,在您的情况下,employee.get(s)会返回Integer个对象。尝试迭代单个Integer对象是没有意义的。你可能只想做

Integer i = employee.get(s).

代替。

一种可能更有效的方法是迭代HashMap.entrySet()。这样,您可以一次性获得姓名和年龄,而无需再次检查HashMap年龄。所以像这样:

for (Map.Entry<String, Integer> entry : employee.entrySet()) {
    String s = entry.getKey();
    Integer i = entry.getValue();
    // Rest of code here
}

希望有所帮助!