如何在Java中创建动态变量名?

时间:2014-05-10 21:11:18

标签: java hashmap

我有一个类型为Map<String, List<Integer>> empage的散列图,其中String是部门的名称,List是在该部门工作的员工的年龄列表。

现在,对于每个部门,我想将员工年龄划分为5个年龄类别,如(0-20,20-40 ......等等)。如何动态地为每个部门创建这5个列表变量?我的意思是我不能对每个部门名称的Finance_grp1等变量名进行硬编码?所以我基本上想要这样的东西:

for(each departname in empage.keyset())
{
create Arraylist departmentname_grp1
create Arraylist departmentname_grp2
create Arraylist departmentname_grp3
.
.
and so on till 5 groups
}

例如,我想要的结构是这样的:

Department Finance
grp1 for age 0-20
grp2 for age 20-40
and so on till grp5

Department HR
grp1 for age 0-20
grp2 for age 20-40
and so on till grp5

对于所有部门名称,我希望将员工年龄分组为

在创建这5个组并将员工年龄分类为类别之后,我想为每个部门名称添加ChartSeries类型的变量,然后我将添加它以创建条形图。所以,我想要类似的东西:

for(department_name in empage)
{
ChartSeries department_name = new ChartSeries();
}

有人可以帮我解决这个问题吗?

更新:我知道在Java中我们无法在创建变量时附加动态字符串。我想要的是这个问题和上述问题的可能解决方案

4 个答案:

答案 0 :(得分:1)

您的问题的基本答案是您无法在Java中动态分配变量名称。这是另一个SO帖子,它有更多可能的解决方法:Assigning Dynamic Variable Names

答案 1 :(得分:0)

好吧我觉得我看得更清楚你要做的事情,但最终问题的答案仍然是使用合适的收藏品。尝试这样的事情:

Map<Department, Map<Integer, List<Employee>>> departmentEmployeeAgeMap;

其中Integer是年龄段,它们分为0-20为0,20-40为1,依此类推。这假设您有一个部门类,如果不这样做,您也可以使用String来表示部门名称。

这样,当您想要存储员工时,可以通过部门密钥访问它们,然后使用整数年龄范围密钥。

因此,如果您需要将员工添加到组中,您可以这样:

Map<Department, Map<Integer, List<Employee>>> departmentEmployeeAgeMap = new Map<Department, Map<Integer, ArrayList<Employee>>>();
Map<Integer, List<Employee>> currentDepartmentAgeMap;

for(department : departments) {
    departmentEmployeeAgeMap.put(department, new Map<Integer, List<Employee>>());
    currentDepartmentAgeMap = departmentEmployeeAgeMap.get(department);
    for(int i=0; i<5; i++) {
        currentDepartmentAgeMap.put(i, new ArrayList<Employee>());
    }
    for(employee : department) {
        currentDepartmentAgeMap.get(employee.getAge()/20).add(employee);
    }
}

然后访问此数据结构以便将员工撤回:

departmentEmployeeAgeMap.get(department).get(1);

将检索在20-39岁之间在特定部门工作的所有员工的列表。

如果你真的想要能够创建动态变量名,你应该考虑除java以外的其他语言。这不是Java的功能,它不能很好地发挥作用。

答案 2 :(得分:0)

如果部门计算对您的业务逻辑非常重要,您可以考虑创建一个新类型,如DeptAgeStat。 它有:

String name;
List<Integer> allAges;

List<Integer> getGroup1(){//return new List, or a ListView of allAges};
List<Integer> getGroup2(){//same as above};
...

List<Integer> getAgesWithWhateverPartitionCondidtions(here could have condition para see below text){...};

这将简化您将来的计算。如果有必要,例如您可以在将来过滤/分组年龄时使用不同的条件,甚至可以将PartitionCriteria类型设计为这些方法的参数。再次,这取决于要求。

希望它有所帮助。

答案 3 :(得分:0)

我建议您更改地图中的列表,这样您就可以:

Map<String, Map<Integer,List<Integer>>>

其中外部地图将部门的字符串作为键,内部地图具有每个年龄组的整数表示(例如0,1,2,3,4)。

*正如@ sage88所说,您可以使用String而不是Integer作为年龄组的键。