2016-04-21 57 views
0

我必须在我的应用程序中实现排序功能。请考虑以下逻辑。Swift中的自定义排序

我想基于给定的输入(例如50)对数组RangeClass对象进行排序。

class RangeClass:NSObject { 
    var start:Int64! 
    var end:Int64! 

    convenience init(s:Int64,e:Int64) { 
     self.init() 
     self.start = s 
     self.end = e 

    } 


    var test1 = RangeClass(s: 50, e: 62) // 50 is in the range 
    var test2 = RangeClass(s: 12, e: 26) // 50 is not in the range 
    var test3 = RangeClass(s: 78, e: 89) // 50 is not in the range 
    var test4 = RangeClass(s: 35, e: 89) // 50 is in the range 
    var test5 = RangeClass(s: 11, e: 74) // 50 is in the range 
    var test6 = RangeClass(s: 26, e: 62) // 50 is in the range 

    var testArr:NSArray=[test1,test2,test3,test4,test5,test6] 

    testArr[0] 
    testArr[0] 


    print(testArr) 


    testArr.sortedArrayUsingComparator { (
     testA, testB) -> NSComparisonResult in 

    let p1 = testA as! RangeClass 
    let p2 = testB as! RangeClass 
    // check whether both are in the range 
    if p1.start > 50 && p1.end < 50 && p2.start > 50 && p2.end < 50 
    { 

     if (p1.start > p2.start) { 
      return NSComparisonResult.OrderedDescending; 
     } else { 
      return NSComparisonResult.OrderedAscending; 
     } 

    }else if (p1.start > 50 && p1.end < 50){ 
     return NSComparisonResult.OrderedAscending 
    }else if (p2.start > 50 && p2.end < 50){ 
     return NSComparisonResult.OrderedDescending 
    }else{ 
     if (p1.start > p2.start) { 
      return NSComparisonResult.OrderedDescending; 
     } else { 
      return NSComparisonResult.OrderedAscending; 
     } 
    } 

} 

我要像

TEST5,TEST6,TEST4,为test1,test2的输出,TEST3

即它的范围是应该先和其对象是不是范围加入最后。

+2

你应该用单词解释你的逻辑。但是第一个'if'测试,不是'<' et '>'倒置的吗? – Larme

回答

0

我不确定这个算法是否能够捕获所有的情况,但至少是问题中的那个。

let refNum : Int64 = 50 

let sortedArray = testArr.sort { (rangeA, rangeB) -> Bool in 
    let a = (rangeA.start...rangeA.end).contains(refNum) 
    let b = (rangeB.start...rangeB.end).contains(refNum) 

    switch (a, b) { 
    case (true, true), (false, false) : return rangeA.start < rangeB.start 
    case (true, false) : return true 
    case (false, true) : return false 
    } 
} 

print(sortedArray) 
+0

升序排序谢谢瓦甸,它的工作 – Sridhar

1

可以这样迅速创建数组:

var testArr = [test1, test2, test3, test4, test5, test6] 

并创建一些排序functioin。在你的情况下,它可以是这样的:

func sortRangesToContainValue(firstItem: RangeClass, secondItem: RangeClass) -> Bool { 
    switch value { 
    case firstItem.start...firstItem.end: 
     return true 
    default: 
     return false 
    } 
} 

这里valuelet value: Int64 = 50

,也是最后一步就是调用sortInPlace方法的数组:

testArr.sortInPlace(sortRangesToContainValue) 

它排序数组所以你希望。要添加新的排序选项,您可以简单地更改方法或添加一个可能使用两个输入参数的新方法。

+0

谢谢亚历克斯,它的工作。我有4件物品(范围内)和2件物品(Rage外)。我需要添加一个排序类似4个对象(在范围内)和2(范围外)对象根据开始 – Sridhar