2017-02-10 63 views
0

我正在使用算法編寫調度程序。在算法的最後階段,我需要查看時間表(創建的時間表),以查看學生當時是否已被分配到班級。確定兩個時間範圍是否重疊

因此,我們有:

Current Class Start Time: (2017, 02, 09, 10, 00, 00) 
Current Class Finish Time: (2017, 02, 09, 11, 00, 00) 

在這個時刻,我們將搜索到的時間表,看看有什麼其他類學生A被分配到:

例如,讓我們在同一天說,他們已分配給:

Class 'Z' Start Time: (2017, 02, 09, 09, 00, 00) 
Class 'Z' Finish Time: (2017, 02, 09, 12, 00, 00) 

現在我想找到類「Z」的時間範圍,並將其與當前類的時間範圍進行比較。

DateTime startClassZ = new DateTime(2017, 02, 09, 09, 00, 00); 
DateTime endClassZ = new DateTime(2017, 02, 09, 12, 00, 00); 

DateTime StartCurrent = new DateTime(2017, 02, 09, 10, 00, 00); 
DateTime StartCurrent = new DateTime(2017, 02, 09, 11, 00, 00); 

if (They do not clash) 
{ 
    Assign 
} 
if (Clash) 
{ 
    Select Another Student 
} 

任何人都可以請我幫助我的'IF聲明',以及如何解決這個問題。

,我想它的方式,有三種可能性:

  1. 如果「當前類」(開始和結束時間),「Z類」(衝突1)
  2. 如果之間的土地「開始時間」'當前類的土地的在「級Z」(衝突2)
  3. 之間。如果在「級Z」(衝突3)
之間的「結束時間」「當前類的土地的

謝謝

+1

「的方式,我我在想,有三種可能性:「你是否嘗試過實現這一點,看看會發生什麼?你已經嘗試了什麼? http://stackoverflow.com/help/how-to-ask – AndyJ

+0

由於班級的長度不盡相同,因此有三種以上的可能性。因此,您有四個變量:開始A,結束A,開始B,結束B.組合爲:1)A在B開始前開始和結束2)A在B之前開始並在B之前結束3)A開始於B之前並在B 4)A在B之後開始,B在B之前結束5)A在B之後開始並在B之後結束6)A在B結束之後開始 – jdweng

+0

不,因爲我想知道是否會有一個解決方案, 09:00:00到12:00:00然後我可以使用if語句來查看開始時間結束時間或新變量(10:00:00到11:00:00)是否會落在Z類變量之間( 09:00:00到12:00:00) –

回答

0

這是做最簡單的方法:

public static bool HasOverlap(DateTime start1, DateTime end1, DateTime start2, DateTime end2) 
{ 
    return start1 < end2 && end1 > start2; 
} 

或者,如果日期不一定是正確的開始/結束順序:

public static bool HasOverlap(DateTime start1, DateTime end1, DateTime start2, DateTime end2) 
{ 
    return Min(start1, end1) < Max(start2, end2) && Max(start1, end1) > Min(start2, end2); 
} 

public static DateTime Max(DateTime d1, DateTime d2) 
{ 
    return d1 > d2 ? d1 : d2; 
} 

public static DateTime Min(DateTime d1, DateTime d2) 
{ 
    return d2 > d1 ? d1: d2; 
} 

注意,如果一個類在2結束而下一個從2開始將不會有重疊。既然你在談論類,我假設這是你想要的。

測試你的例子:

static void Main(string[] args) 
{ 
    DateTime startClassZ = new DateTime(2017, 02, 09, 09, 00, 00); 
    DateTime endClassZ = new DateTime(2017, 02, 09, 12, 00, 00); 

    DateTime StartCurrent = new DateTime(2017, 02, 09, 10, 00, 00); 
    DateTime EndCurrent = new DateTime(2017, 02, 09, 11, 00, 00); 


    if(HasOverlap(startClassZ, endClassZ, StartCurrent, EndCurrent)) 
    { 
     Console.WriteLine("clash"); 
    } 
    else 
    { 
     Console.WriteLine("yay"); 
    } 
    Console.Read(); 
} 

我已經添加了一些快速測試,爲您提供:

public static void Test1() 
{ 
    // Class A overlaps class B 
    DateTime aStart = DateTime.Parse("2017-01-01T09:00:00"); 
    DateTime aEnd = DateTime.Parse("2017-01-01T10:00:00"); 

    DateTime bStart = DateTime.Parse("2017-01-01T09:30:00"); 
    DateTime bEnd = DateTime.Parse("2017-01-01T11:00:00"); 

    bool isCorrect = HasOverlap(aStart, aEnd, bStart, bEnd) == true; 
    Console.WriteLine($"1: {isCorrect}"); 
} 

public static void Test2() 
{ 
    // Class A "surrounds" class B 
    DateTime aStart = DateTime.Parse("2017-01-01T09:00:00"); 
    DateTime aEnd = DateTime.Parse("2017-01-01T15:00:00"); 

    DateTime bStart = DateTime.Parse("2017-01-01T09:30:00"); 
    DateTime bEnd = DateTime.Parse("2017-01-01T11:00:00"); 

    bool isCorrect = HasOverlap(aStart, aEnd, bStart, bEnd) == true; 
    Console.WriteLine($"2: {isCorrect}"); 
} 

public static void Test3() 
{ 
    // Class B "surrounds" class A 
    DateTime aStart = DateTime.Parse("2017-01-01T09:30:00"); 
    DateTime aEnd = DateTime.Parse("2017-01-01T11:00:00"); 

    DateTime bStart = DateTime.Parse("2017-01-01T09:00:00"); 
    DateTime bEnd = DateTime.Parse("2017-01-01T15:00:00"); 

    bool isCorrect = HasOverlap(aStart, aEnd, bStart, bEnd) == true; 
    Console.WriteLine($"3: {isCorrect}"); 
} 

public static void Test4() 
{ 
    // Class A is before Class B 
    DateTime aStart = DateTime.Parse("2017-01-01T09:00:00"); 
    DateTime aEnd = DateTime.Parse("2017-01-01T11:00:00"); 

    DateTime bStart = DateTime.Parse("2017-01-01T11:00:00"); 
    DateTime bEnd = DateTime.Parse("2017-01-01T12:00:00"); 

    bool isCorrect = HasOverlap(aStart, aEnd, bStart, bEnd) == false; 
    Console.WriteLine($"4: {isCorrect}"); 
} 

public static void Test5() 
{ 
    // Class A is after Class B 
    DateTime aStart = DateTime.Parse("2017-01-01T12:00:00"); 
    DateTime aEnd = DateTime.Parse("2017-01-01T14:00:00"); 

    DateTime bStart = DateTime.Parse("2017-01-01T11:00:00"); 
    DateTime bEnd = DateTime.Parse("2017-01-01T12:00:00"); 

    bool isCorrect = HasOverlap(aStart, aEnd, bStart, bEnd) == false; 
    Console.WriteLine($"5: {isCorrect}"); 
} 

public static void Test6() 
{ 
    // Class B overlaps class A 
    DateTime bStart = DateTime.Parse("2017-01-01T09:00:00"); 
    DateTime bEnd = DateTime.Parse("2017-01-01T10:00:00"); 

    DateTime aStart = DateTime.Parse("2017-01-01T09:30:00"); 
    DateTime aEnd = DateTime.Parse("2017-01-01T11:00:00"); 

    bool isCorrect = HasOverlap(aStart, aEnd, bStart, bEnd) == true; 
    Console.WriteLine($"6: {isCorrect}"); 
} 

static void Main() 
{ 
    Test1(); 
    Test2(); 
    Test3(); 
    Test4(); 
    Test5(); 
    Test6(); 
    Console.Read(); 
} 
+0

但爲什麼要有3組代碼?我理解前兩組,但第三組呢? –

+0

@TimJones什麼?第一個是你需要的代碼,另一個是你的例子,第三個是一組邏輯測試用例,它們都應該返回true來證明它的工作。特別是當其他人回答似乎認爲它不起作用時,證明它確實是明智的。 – john

+0

任何原因downvote,神祕downvoter。請提供功能不起作用的測試用例。 – john

0

你提供三種可能性:

A)整體currentClasszClass

B)的開頭是zClass

C)結束的currentClasszClass

我想指出的是,A)是指結合一樣B)和C),從而不需要特別的注意。此外,如果你會嘗試在你的心中畫一個簡單的草圖(或在紙上)班時間,那麼情況會彈出自己出很自然的:

clash = (endOfCurrentClass > startOfZClass) || (startOfCurrentClass < endOfZClass)

剩下的就是去思考(例如endOfCurrentClass == startOfZClass),但這取決於其他約束(班級時間是否在班級之間包含暫停?他們是否在同一個房間?......)。然而,這是另一個問題。

0

你需要仔細檢查: classZ與目前在這種情況下

DateTime startClassZ = new DateTime(2017, 02, 09, 09, 00, 00); 
DateTime endClassZ = new DateTime(2017, 02, 09, 12, 00, 00); 

DateTime startCurrent = new DateTime(2017, 02, 10, 10, 00, 00); 
DateTime endCurrent = new DateTime(2017, 02, 09, 11, 00, 00); 

與classZ當前

DateTime startClassZ = new DateTime(2017, 02, 09, 09, 00, 00); 
DateTime endClassZ = new DateTime(2017, 02, 09, 12, 00, 00); 

DateTime startCurrent = new DateTime(2017, 02, 08, 10, 00, 00); 
DateTime endCurrent = new DateTime(2017, 02, 09, 13, 00, 00); 

全部代碼是在這裏:

DateTime startClassZ = new DateTime(2017, 02, 09, 09, 00, 00); 
DateTime endClassZ = new DateTime(2017, 02, 09, 12, 00, 00); 

DateTime startCurrent = new DateTime(2017, 02, 08, 10, 00, 00); 
DateTime endCurrent = new DateTime(2017, 02, 09, 13, 00, 00); 


bool ClashCurrentStart = startClassZ < startCurrent && startCurrent < endClassZ; 
bool ClashCurrentEnd = startClassZ < endCurrent && endCurrent < endClassZ; 
//bool ClashCurrentBetween = ClashCurrentStart && ClashCurrentEnd; 

bool ClashClassZStart = startCurrent < startClassZ && startClassZ < endCurrent; 
bool ClashClassZEnd = startCurrent < endClassZ && endClassZ < endCurrent; 
//bool ClashClassZBetween = ClashClassZStart && ClashClassZEnd; 


bool Clash = ClashCurrentStart || ClashCurrentEnd || ClashClassZStart || ClashClassZEnd; 

if (!Clash) 
{ 
    //Assign 
} 
else // Clash 
{ 
    //Select Another Student 
} 
+0

這太複雜了。 – john

+0

此應用方式: DateTime startClassZ = new DateTime(2017,02,09,09,00,00); DateTime endClassZ = new DateTime(2017,02,09,12,00,00); DateTime StartCurrent = new DateTime(2017,02,09,08,00,00); DateTime EndCurrent = new DateTime(2017,02,09,13,00,00); 但您的代碼不起作用 –

+0

我的代碼表明那些時間會導致重疊。我的大腦也表明那些時間重疊。也許你應該嘗試我的代碼,然後再說它不起作用? – john

相關問題