对java中Set是一个不包括重复元素的集合的理解

原创
2013/04/02 14:03
阅读数 898

    在Java中使用Set,可以方便地将需要的类型以集合类型保存在一个变量中.主要应用在显示列表.Set是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。对此我刚开始对此没有很深刻的认识,自从前几天我被我自己写的一段程序搞得烦躁的很,我才明白Set的不包括重复元素的机制。

String pname="工作周报";
 Set<User> users=userDAO.findUserByEnabled(true);
List<Project> list3 = new ArrayList<Project>();
Calendar time=Calendar.getInstance();
Calendar date=Calendar.getInstance();
 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
 String sDate=sdf.format(date.getTime());
 String strDate=sDate.substring(8, 10);
  int days=Integer.parseInt(strDate);
int month =time.get(Calendar.MONTH);

 int year=time.get(Calendar.YEAR);

int year=time.get(Calendar.YEAR);
for(int i=days;i>0;i--){
List<User> list2 = new ArrayList<User>();
list2.addAll(users);
Project project2=new Project();
project2.setCreateDate(Calendar.getInstance());
project2.getCreateDate().set(year, month, i, 0, 0, 0);
Calendar atime=project2.getCreateDate();
Set<Activity> acts=project2.getActivities();
Set<Task> tasks=project2.getTasks();
Set<ProjectFinance>  finances=project2.getProjectFinances();
Set<Activity> activitys=activityDAO.findActivityByActivityTime(atime);
for(Activity activity:activitys)
{
if(!activity.getProject().getProjectName().equals(pname)){
 
Calendar actTime=activity.getActivityTime();
Calendar created=activity.getCreatedDate();
Calendar activityTime=Calendar.getInstance();
int actWeek=actTime.get(Calendar.DAY_OF_WEEK);
if(actWeek<5){
activityTime.set(year,month, i+1, 11, 0, 0);

}else{
    activityTime.set(year,month, i+3, 11, 0, 0);
}
int biJiao=activityTime.compareTo(created);
if(biJiao==1){
acts.add(activity);
list2.remove(activity.getUserByCreater());
}else{
Task task =new Task();
task.setUserByCreater(activity.getUserByCreater());
tasks.add(task);
list2.remove(activity.getUserByCreater());
}
}
}
for(User user:list2)

ProjectFinance finance=new ProjectFinance();
finance.setUserByCreater(user);
finances.add(finance);
}
list3.add(project2);
}  
return list3;
      当时我觉得在循环user时每次都循环一个新的ProjectFinance,然后再给finance的创建人赋值,而且每次的值都不一样,这样应该每次set进去的对象应该不一样,然后finances集合中应该有很多值,但是让我很不解的是每次运行这段程序的时候,finances集合总是只有一个对象,就是第一个。这个问题困扰了我很久,然后有一天我和我同事讨论的时候,我突然之间想起先给每一个ProjectFinance对象set一个Id;然后再把这个对象set到finances的Set集合中去试试,结果没想到问题就这样解决了。

  这时,我才明白Set是一个不包括重复元素的Collection的真正意义。对于Set中变量是字符串或数字时,例如

 Set  set=new HashSet();
   set.add("abc");
   set.add("cde");此时只要字符串不相同就可以增加进去。

但是如果Set中的变量一个对象,比如该对象包括id、userName、password、cname等字段,并且是以id作为主键时,Set这样的对象时,set只要检查id这个主键的值是否是一样的,如果是一样的,它只会set第一个。这就是我的程序中finances中为什么总是只有一个值得原因:就是我没有设置每个新的ProjectFinance的id的值。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部