2017-01-02 6 views
0

すべてのCourseGroupの毎週月曜日の期間番号1をtrueに設定しようとしていますが、唯一Mondays.Kindlyが 私はオブジェクトの一部を変更していますが、条件セットを考慮せずにリストのすべてのオブジェクトを変更し続けます

import java.util.ArrayList; 

import java.util.Arrays; 

import java.util.List; 

import java.util.Objects; 

class HelloWorld { 



    public static void main(String[] args) { 
     SchoolObject schoolObject; 
     List<LecturePeriod> lecturePeriods = new ArrayList<>(); 
     for (int i = 1; i <= 10; i++) { 
      String periodName = "Period " + i; 
      int periodNo = i; 
      boolean isPeriodAllocated = false; 
      lecturePeriods.add(new LecturePeriod(periodName, periodNo, isPeriodAllocated)); 
     } 

     List<Day> days = new ArrayList<>(); 
     for (int i = 1; i <= 5; i++) { 
      String dayName; 
      switch (i) { 
       case 1: 
        dayName = "MONDAY"; 
        break; 
       case 2: 
        dayName = "TUESDAY"; 
        break; 
       case 3: 
        dayName = "WEDNESDAY"; 
        break; 
       case 4: 
        dayName = "THURSDAY"; 
        break; 
       case 5: 
        dayName = "FRIDAY"; 
        break; 
       default: 
        dayName = "NONE"; 
      } 

      int dayNo = i; 
      days.add(new Day(dayName, dayNo, lecturePeriods)); 
     } 

     List<YearGroup> yearGroups = new ArrayList<>(); 
     for (int i = 1; i <= 3; i++) { 
      int yearGroupNumber = i; 
      if (Objects.equals(i, 1)) { 
       yearGroups.add(new YearGroup(yearGroupNumber, new ArrayList<>(Arrays.asList(new CourseGroup("Science" + 1, days))))); 
      } else if (Objects.equals(i, 2)) { 
       yearGroups.add(new YearGroup(yearGroupNumber, new ArrayList<>(Arrays.asList(new CourseGroup("Science" + 2, days))))); 
      } else if (Objects.equals(i, 3)) { 
       yearGroups.add(new YearGroup(yearGroupNumber, new ArrayList<>(Arrays.asList(new CourseGroup("Science" + 3, days))))); 
      } 

     } 

     schoolObject = new SchoolObject(); 
     schoolObject.setYearGroups(yearGroups); 
     System.out.println("School Object Before Changing Periods="+schoolObject.toString()); 

     schoolObject.getYearGroups().forEach(yearGroup -> { 
      yearGroup.getCourseGroups().forEach(courseGroup -> { 
       courseGroup.getDays().forEach(day -> { 
        String dayName = day.getDayName(); 
        if (Objects.equals(dayName, "MONDAY")) { 
         day.getLecturePeriods().forEach(lecturePeriod -> { 
          int lecturePeriodNumber = lecturePeriod.getPeriodNumber(); 
          if (Objects.equals(lecturePeriodNumber, 1)) { 
           lecturePeriod.setIsPeriodAllocated(true); 

          } 
         }); 
        } 
       }); 
      }); 
     }); 
     System.out.println("\nSchool Object After Changing Periods=" + schoolObject.toString()); 
     final int[] numberOfAllocatedPeriodsExpected = {0}; 
     schoolObject.getYearGroups().forEach(yearGroup -> { 
      yearGroup.getCourseGroups().forEach(courseGroup -> { 
       courseGroup.getDays().forEach(day -> { 
        day.getLecturePeriods().forEach(lecturePeriod -> { 
         int lecturePeriodNumber = lecturePeriod.getPeriodNumber(); 
         if (Objects.equals(lecturePeriodNumber, 1)) { 
          numberOfAllocatedPeriodsExpected[0]++; 
         } 
        }); 
       }); 
      }); 
     }); 


     System.out.println("\nTest result ="+Objects.equals(numberOfAllocatedPeriodsExpected[0],3)); 

    } 




    public static class SchoolObject { 
     List<YearGroup> yearGroups; 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("SchoolObject{"); 
      sb.append("yearGroups=").append(yearGroups); 
      sb.append('}'); 
      return sb.toString(); 
     } 

     public List<YearGroup> getYearGroups() { 
      return yearGroups; 
     } 

     public void setYearGroups(List<YearGroup> yearGroups) { 
      this.yearGroups = yearGroups; 
     } 
    } 

    public static class YearGroup { 

     int yearGroupNumber; 
     List<CourseGroup> courseGroups; 

     public YearGroup(int yearGroupNumber, List<CourseGroup> courseGroups) { 
      this.yearGroupNumber = yearGroupNumber; 
      this.courseGroups = courseGroups; 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("YearGroup{"); 
      sb.append("yearGroupNumber=").append(yearGroupNumber); 
      sb.append(", courseGroups=").append(courseGroups); 
      sb.append('}'); 
      return sb.toString(); 
     } 

     public int getYearGroupNumber() { 
      return yearGroupNumber; 
     } 

     public void setYearGroupNumber(int yearGroupNumber) { 
      this.yearGroupNumber = yearGroupNumber; 
     } 

     public List<CourseGroup> getCourseGroups() { 
      return courseGroups; 
     } 

     public void setCourseGroups(List<CourseGroup> courseGroups) { 
      this.courseGroups = courseGroups; 
     } 
    } 

    public static class CourseGroup { 
     String courseGroupName; 
     List<Day> days; 

     public CourseGroup(String courseGroupName, List<Day> days) { 
      this.courseGroupName = courseGroupName; 
      this.days = days; 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("CourseGroup{"); 
      sb.append("courseGroupName='").append(courseGroupName).append('\''); 
      sb.append(", days=").append(days); 
      sb.append('}'); 
      return sb.toString(); 
     } 

     public List<Day> getDays() { 
      return days; 
     } 

     public void setDays(List<Day> days) { 
      this.days = days; 
     } 

     public String getCourseGroupName() { 
      return courseGroupName; 
     } 

     public void setCourseGroupName(String courseGroupName) { 
      this.courseGroupName = courseGroupName; 
     } 
    } 

    public static class Day { 
     String dayName; 
     int dayNo; 
     List<LecturePeriod> lecturePeriods; 

     public Day(String dayName, int dayNo, List<LecturePeriod> lecturePeriods) { 
      this.dayName = dayName; 
      this.lecturePeriods = lecturePeriods; 
      this.dayNo = dayNo; 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("Day{"); 
      sb.append("dayName='").append(dayName).append('\''); 
      sb.append(", dayNo=").append(dayNo); 
      sb.append(", lecturePeriods=").append(lecturePeriods); 
      sb.append('}'); 
      return sb.toString(); 
     } 

     public String getDayName() { 
      return dayName; 
     } 

     public void setDayName(String dayName) { 
      this.dayName = dayName; 
     } 

     public int getDayNo() { 
      return dayNo; 
     } 

     public void setDayNo(int dayNo) { 
      this.dayNo = dayNo; 
     } 

     public List<LecturePeriod> getLecturePeriods() { 
      return lecturePeriods; 
     } 

     public void setLecturePeriods(List<LecturePeriod> lecturePeriods) { 
      this.lecturePeriods = lecturePeriods; 
     } 
    } 

    public static class LecturePeriod { 
     String periodName; 
     int periodNumber; 
     boolean isPeriodAllocated; 

     public LecturePeriod(String periodName, int periodNumber, boolean isPeriodAllocated) { 
      this.periodName = periodName; 
      this.periodNumber = periodNumber; 
      this.isPeriodAllocated = isPeriodAllocated; 
     } 

     @Override 
     public String toString() { 
      final StringBuilder sb = new StringBuilder("LecturePeriod{"); 
      sb.append("periodName='").append(periodName).append('\''); 
      sb.append(", periodNumber=").append(periodNumber); 
      sb.append(", isPeriodAllocated=").append(isPeriodAllocated); 
      sb.append('}'); 
      return sb.toString(); 
     } 

     public String getPeriodName() { 
      return periodName; 
     } 

     public void setPeriodName(String periodName) { 
      this.periodName = periodName; 
     } 

     public int getPeriodNumber() { 
      return periodNumber; 
     } 

     public void setPeriodNumber(int periodNumber) { 
      this.periodNumber = periodNumber; 
     } 

     public boolean isPeriodAllocated() { 
      return isPeriodAllocated; 
     } 

     public void setIsPeriodAllocated(boolean isPeriodAllocated) { 
      this.isPeriodAllocated = isPeriodAllocated; 
     } 
    } 
} 

は、データの出力を観察下の例をチェックアウトし、あなたはschoolObjectではなく、唯一の月曜日の各courseGroup内のすべての日のためにtrueにすべてのlecturePeriodsを設定していることに気づきます。 ご協力いただければ幸いです。 注:gsonまたはjacksonを使用せずに、最小限の問題を抽出するために最善の努力をしました。 テストのために、私はすべてを1つのクラスに窮屈にしました。

あなたはすべての日のための講義期間の同じ参照割り当てているので、これは、ここでhttp://ideone.com/3uyE5G

+0

本当にこのコードはすべて必要ですか?コードと出力を本質的にもう少し細分化することはできますか?ほとんどの人は長さのためにそれをすべて見ていません。 –

答えて

2

をサンプルを確認することができます。このため

days.add(new Day(dayName, dayNo, lecturePeriods)); 

を、毎回あなたがlecturePeriodsでプロパティを変更しますそれらのすべてのために変更される日のいずれかにオブジェクト。この問題を解決するために、それぞれの日は、それがlecturePeriods

valarauko @
List<LecturePeriod> lecturePeriods = new ArrayList<>(); 
for (int j = 1; j <= 10; j++) { 
    lecturePeriods.add(new LecturePeriod("Period " + j, j, false)); 
} 
days.add(new Day(dayName, dayNo, lecturePeriods)); 
+0

こんにちは、@ valarauko、問題の根本原因を教えてくれてありがとう。あなたの診断は私が今質問に答えてくれたよりスケーラブルな解決策を得るのを助けました。あなたの時間にとても感謝します。 – Rbk

0

の独自のインスタンスの有しなければならない、あなたが示したものを私は毎日、それがlecturePeriodsの独自のインスタンスの持っていた、完全に本当だったが、よりスケーラブルなソリューションIオブジェクトが異なる数の方法で初期化されている可能性があるので、私が行ったことは

です。オブジェクトをjson Stringに変換します。

2.操作の前に元のオブジェクトに戻します。

私はgsonを上記の2つのステップで使用しましたが、学校のオブジェクトで毎日どのように初期化したかにかかわらず、完全に動作します。

私に根本原因@valaraukoをもう一度見せてくれてありがとう。

関連する問題