對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

相關文章
相關標籤/搜索