2017-04-11 2 views
0

Ich habe einen Deadline-Tracker erstellt, um zu verwalten, wie viel Arbeit jemand für eine bestimmte Zeit hat.Filtern eines Sets nach Enum-Typ

Der Deadline-Tracker trennt Probleme in "Workload-Perioden", das sind Sammlungen von Problemen, die denselben Termin haben. Der Status der Zeiträume ist type enum und kann entweder UNSCHEDULED, FUTURE, FREEZE oder OVERDUE sein.

Ich habe jedoch ein Problem, wo WorkloadPeriods als "in Einfrieren" definiert werden, wenn nur einige der Probleme im Einfrieren sind. Jede Ausgabe hat eine FreezeLength, DeadlineDate und DeadlineStatus.

Ich möchte diese "in Freeze" Probleme in eine separate WorkloadPeriod trennen. Wie filtere ich die Probleme nach DeadlineDate und DeadlineStatus, um dieses Problem zu vermeiden?

public static class WorkloadPeriod implements Comparable<WorkloadPeriod> 
{ 
    private final LocalDate start; 

    @Nullable 
    private final LocalDate deadline; 

    private final SortedSet<Issue> issues = new TreeSet<>(); 

    private DeadlineStatus deadlineStatus; 

    private Stream inFreeze; 

    public WorkloadPeriod(final LocalDate start, final Iterable<Issue> issues) 
    { 
     this.start = start; 
     deadline = StreamSupport.stream(issues.spliterator(), false) 
           .map(Issue::getDeadline) 
           .filter(Optional::isPresent) 
           .map(Optional::get) 
           .max(Ordering.natural()) 
           .orElse(null); 
     inFreeze = StreamSupport.stream(issues.spliterator(), false) 
           .map(Issue::getDeadlineStatus) 
           .filter(deadlineStatus1 -> deadlineStatus1 == DeadlineStatus.FREEZE); 
     Iterables.addAll(this.issues, issues); 

     final int defaultFreezeLengthDays = StreamSupport.stream(issues.spliterator(), false) 
                .filter(i -> i.getFields() != null 
                   && i.getFields().getProject() != null 
                   && i.getFields().getProject().getFreezeLengthDays() != 0) 
                .mapToInt(i -> i.getFields().getProject().getFreezeLengthDays()) 
                 .max().orElse(0); 
     final LocalDate freezeDate = deadline == null ? null : deadline.minus(defaultFreezeLengthDays, ChronoUnit.DAYS); 

     deadlineStatus = DeadlineStatus.getDeadlineStatus(LocalDate.now(), freezeDate, deadline); 
    } 

    @Override 
    public int compareTo(@Nonnull final WorkloadPeriod o) 
    { 
     return new CompareToBuilder() 
      .append(getStart(), o.getStart()) 
      .append(getDeadline(), o.getDeadline(), new OptionalComparator()) 
      .append(getIssues().size(), o.getIssues().size()) 
      .append(hashCode(), o.hashCode()) 
      .toComparison(); 
    } 

    @Override 
    public boolean equals(final Object o) 
    { 
     if (this == o) 
     { 
      return true; 
     } 
     if (o == null || getClass() != o.getClass()) 
     { 
      return false; 
     } 
     final WorkloadPeriod workload = (WorkloadPeriod) o; 
     return Objects.equals(getStart(), workload.getStart()) && 
       Objects.equals(getDeadline(), workload.getDeadline()) && 
       Objects.equals(getIssues(), workload.getIssues()); 
    } 

    public Optional<LocalDate> getDeadline() 
    { 
     return Optional.ofNullable(deadline); 
    } 

    public DeadlineStatus getDeadlineStatus() 
    { 
     return deadlineStatus; 
    } 

    public SortedSet<Issue> getIssues() 
    { 
     return issues; 
    } 
} 
+0

Ich verstehe nicht, welchen Teil des Codes Sie ändern möchten. Sie haben eine Frage auf hoher Ebene gestellt, und es ist nicht klar, was Sie an dem Code ändern möchten. Können Sie bitte nur den Code eingeben, der für die Frage relevant ist? Selbst wenn das bedeutet, einen Beispielcode anstelle des tatsächlichen Codes zu veröffentlichen, würden einige greifbare gewünschte Ausgabedifferenzen geschätzt werden. – 4castle

Antwort

1

Können Sie Ihre Frage neu einrahmen, damit sie leichter zu verstehen ist? Wie sieht die Issue-Klasse aus? Ich kann hier nur eine hohe Antwort geben, da ich das eigentliche Problem nicht kenne.

Ich würde vorschlagen, dass die Java-8 groupingBy Klausel, um eine Karte erstellen mit < Issue.Type, Set < Typ >>. Überprüfen Sie es und wenn Sie Probleme mit diesem Ansatz haben, verwenden Sie stattdessen eine EnumMap.