2017-11-19 13 views
0

私は時間のセットをマージしようとしています。私はこのようなものを持っていることを意味します。私のコードは単一のデータに適しています。どのようにしてn回行うことができますか?時刻のマージセット -

BEFORE MERGE: 
[ 
    { 
     "start": "11:00", 
     "end" : "15:00" 
    }, 
    { 
     "start": "10:00", 
     "end" : "12:00" 
    } 
] 


AFTER MERGE: 

[ 
    { 
     "start": "10:00", 
     "end" : "15:00" 
    } 
] 

マイコード:私はScheduleEntryのリストについては、それを実装することができますかわからない

public List<ScheduleEntry> merge(ScheduleEntry a, ScheduleEntry b) { 

     List<ScheduleEntry> entries = new ArrayList<>(); 

     int durationInMinuteBetweenStarts = parseTimeString(a.getStartTime()) - parseTimeString(b.getStartTime()); 
     int durationInMinuteBetweenEnds = parseTimeString(a.getEndTime()) - parseTimeString(b.getEndTime()); 
     int durationInMinuteBetweenStartAAndBEnd = parseTimeString(a.getStartTime()) - parseTimeString(b.getEndTime()); 
     int durationInMinuteBetweenStartBAndAEnd = parseTimeString(b.getStartTime()) - parseTimeString(a.getEndTime()); 


     if(durationInMinuteBetweenStartAAndBEnd > 0 || durationInMinuteBetweenStartBAndAEnd < 0) { 
      entries.add(a); 
      entries.add(b); 
     } 

     else if(durationInMinuteBetweenStarts < 0 && durationInMinuteBetweenEnds >= 0) { 
      String newStart = a.getStartTime(); 
      String newEnd = a.getEndTime(); 

      entries.add(new ScheduleEntry(newStart, newEnd)); 
     } 

     else if(durationInMinuteBetweenStarts >= 0 && durationInMinuteBetweenEnds < 0) { 
      String newStart = b.getStartTime(); 
      String newEnd = b.getEndTime(); 

      entries.add(new ScheduleEntry(newStart, newEnd)); 
     } 

     else if(durationInMinuteBetweenStarts <= 0 && durationInMinuteBetweenEnds <= 0) { 
      String newStart = a.getStartTime(); 
      String newEnd = b.getEndTime(); 

      entries.add(new ScheduleEntry(newStart, newEnd)); 
     } 

     else if(durationInMinuteBetweenStarts > 0 && durationInMinuteBetweenEnds >= 0) { 
      String newStart = b.getStartTime(); 
      String newEnd = a.getEndTime(); 

      entries.add(new ScheduleEntry(newStart, newEnd)); 
     } 

     return entries; 
    } 

    private int parseTimeString(String s) { 
     String[] t = s.split(":"); 
     return Integer.parseInt(t[0]) * 60 + Integer.parseInt(t[1]); 
    } 

:/私は答えを見つけるためにしようと、それを並べ替えるとすべきか?上記のコードの基本的なアイデアは、時間の間の期間をチェックし、答えを指定することです。

+2

あなたのコードを含めてください。 – clemens

+0

ようこそスタックオーバーフロー! [ツアー](ツアー)を見て回り、[ヘルプセンター](/ help)、特に[どのように良い質問をしますか?](/ help/how-to-質問)と[ここではどのような話題について聞くことができますか?](/ help/on-topic)その2番目のリンクから:「宿題の助けを求める質問には、問題を解決するために今まで行ってきた作業の概要と、それを解決している困難の説明が含まれていなければなりません。これは、外部サービスへのリンクであってはなりません。 –

+0

私のコードは?どういう意味ですか?私のコードは、pasterbinファイルにあります。 –

答えて

0

new Date and Time APIをチェックしてください。ループ内のすべてのScheduledTimesを実行し、max stopおよびmin startを確認します。

ArrayList<ScheduleEntries> times = new ArrayList<>(); 

times.add(new ScheduleEntries(LocalTime.of(8, 00), LocalTime.of(12, 00))); 
times.add(new ScheduleEntries(LocalTime.of(11, 00), LocalTime.of(15, 00))); 
times.add(new ScheduleEntries(LocalTime.of(9, 00), LocalTime.of(17, 00))); 

LocalTime minStart = times.get(0).getStart(); 
LocalTime maxStop = times.get(0).getStop(); 

for (ScheduleEntries time : times) { 
    if (time.getStart().isBefore(minStart)) { 
     minStart = time.getStart(); 
    } 
    if (time.getStop().isAfter(maxStop)) { 
     maxStop = time.getStop(); 
    } 
} 

編集:これは私が思い付いたものです。アイデアは、リスト内のすべての時間を持っているし、リストを並べ替えることで、このような、そのように何か:

08:00 -> start 
12:00 -> stop 
11:00 -> start 
15:00 -> stop 
09:00 -> start 
17:00 -> stop 
18:00 -> start 
20:00 -> stop 
18:00 -> start 
21:00 -> stop 

は次のようになります。

08:00 -> start 
09:00 -> start 
11:00 -> start 
12:00 -> stop 
15:00 -> stop 
17:00 -> stop 
18:00 -> start 
18:00 -> start 
20:00 -> stop 
21:00 -> stop 

は、次に、あなただけの開始との間での解消を取得する必要がありますそれは問題ではありません。

全コード:(私はmainメソッドからそれを実行するので、それはだ、すべての静的なたわごとを無視する)

public static void main(String[] args) { 
    ArrayList<ScheduleEntries> times = new ArrayList<>(); 
    ArrayList<ScheduleEntries> mergedTimes = new ArrayList<>(); 

    times.add(new ScheduleEntries(LocalTime.of(8, 00), LocalTime.of(12, 00))); 
    times.add(new ScheduleEntries(LocalTime.of(11, 00), LocalTime.of(15, 00))); 
    times.add(new ScheduleEntries(LocalTime.of(9, 00), LocalTime.of(17, 00))); 
    times.add(new ScheduleEntries(LocalTime.of(18, 00), LocalTime.of(20, 00))); 
    times.add(new ScheduleEntries(LocalTime.of(18, 00), LocalTime.of(21, 00))); 

    // Add all the times in a list 
    ArrayList<Time> allTimes = new ArrayList<>(); 
    times.forEach(time -> { 
     allTimes.add(new Time(time.getStart(), "start")); 
     allTimes.add(new Time(time.getStop(), "stop")); 
    }); 

    // Sort the list, I used a bubblesort 
    boolean sorted = false; 
    LocalTime tempTime; 
    String tempString; 
    while (!sorted) { 
     sorted = true; 
     for (int i = 0; i < allTimes.size() - 1; i++) { 
      if (allTimes.get(i).getTime().isAfter(allTimes.get(i + 1).getTime())) { 
       tempTime = allTimes.get(i + 1).getTime(); 
       tempString = allTimes.get(i + 1).getStartOrStop(); 

       allTimes.get(i + 1).setTime(allTimes.get(i).getTime()); 
       allTimes.get(i + 1).setStartOrStop(allTimes.get(i).getStartOrStop()); 

       allTimes.get(i).setTime(tempTime); 
       allTimes.get(i).setStartOrStop(tempString); 
       sorted = false; 
      } 
     } 
    } 

    // Only keep the relevant times 
    LocalTime tempstart; 
    int i = 0; 
    while (i < allTimes.size()) { 
     tempstart = allTimes.get(i).getTime(); 
     // iterate till you find a stop 
     while (allTimes.get(i).getStartOrStop().equals("start")) { 
      i++; 
     } 
     // iterate till you find a start, incase there's several stops in a row 
     while (i < allTimes.size() && allTimes.get(i).getStartOrStop().equals("stop")) { 
      i++; 
     } 
     mergedTimes.add(new ScheduleEntries(tempstart, allTimes.get(i - 1).getTime())); 
    } 

    // Print to check 
    mergedTimes.forEach(time -> { 
     System.out.println("Start: " + time.getStart() + ", Stop: " + time.getStop()); 
    }); 
} 

// The class I made to hold the time and wether it's a start or a stop. 
static class Time { 
    private LocalTime time; 
    private String startOrStop; 
    public Time(LocalTime time, String startOrStop) { 
     this.time = time; 
     this.startOrStop = startOrStop; 
    } 
    // Getter and setter 
    public String getStartOrStop() { return startOrStop; } 
    public void setStartOrStop(String startOrStop) { this.startOrStop = startOrStop; } 
    public LocalTime getTime() { return time; } 
    public void setTime(LocalTime time) { this.time = time; } 
} 
+0

この場合はどうなりますか:1)開始:08:00、終了:10:00。 2)開始:11:00、終了:13:00? –

+0

更新されました。 – Touniouk

関連する問題