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

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

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

 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中变量是字符串或数字时,例如 rem

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

可是若是Set中的变量一个对象,好比该对象包括id、userName、password、cname等字段,而且是以id做为主键时,Set这样的对象时,set只要检查id这个主键的值是不是同样的,若是是同样的,它只会set第一个。这就是个人程序中finances中为何老是只有一个值得缘由:就是我没有设置每一个新的ProjectFinance的id的值。 get

相关文章
相关标签/搜索