2017-02-10 70 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

相关问题