如何使用排序对元组数组进行排序? (不能使用类型的参数列表调用'sorted')

时间:2016-12-11 16:01:49

标签: arrays swift sorting swift3

我正在尝试使用sorted对元组数组进行排序。

我得到的错误是:

  

无法使用类型的参数列表调用'sorted'(((MyClass1,MyClass2)) - > Bool)

数组的创建方式如下:

class MyClass1 {
    var id: Int
    init(id:Int) { self.id = id }
}

class MyClass2 {
    var id2: Int
    init(id2:Int) { self.id2 = id2 }
}
let array1 = [MyClass1(id:4), MyClass1(id:3), MyClass1(id:2), MyClass1(id:1)]
let array2 = [MyClass2(id2:1), MyClass2(id2:2), MyClass2(id2:3), MyClass2(id2:4)]
var tuples = zip(array1, array2)

我尝试过:

tuples = tuples.sorted { (left, right) -> Bool in
    return left.1.id2 > right.1.id2
}

tuples = tuples.sorted { $0.1.id2 > $1.1.id2 }

tuples = tuples.sorted(by: { (first: (MyClass1, MyClass2), second: (MyClass1, MyClass2)) -> Bool in
    return first.1.id2 > second.1.id2
})

预期输出为(伪,手写):

[(myClass1WithId_1, myClass2WithId2_4),(myClass1WithId_2, myClass2WithId2_3),(myClass1WithId_3, myClass2WithId2_2),(myClass1WithId_4, myClass2WithId2_1)]

按myClass2.id2降序排序的元组。

更新

我发现了如何解决这个问题。错误似乎是错误的/误导性的。

我可以在将结果分配给新变量时对其进行排序:

let tuples2 = tuples.sorted { (left, right) -> Bool in
    return left.1.id2 > right.1.id2
}

将其分配给现有变量时,会给出上述错误:

tuples = tuples.sorted { (left, right) -> Bool in
    return left.1.id2 > right.1.id2
}

2 个答案:

答案 0 :(得分:1)

  

我正在尝试对元组数组进行排序

但问题是您的tuples 不是数组。 (这是一种称为Zip2Sequence的东西。)解决方案是将其强制转换为数组:

var tuples = Array(zip(array1, array2))

现在您的原始代码将起作用:

let array1 = [MyClass1(id:4), MyClass1(id:3), MyClass1(id:2), MyClass1(id:1)]
let array2 = [MyClass2(id2:1), MyClass2(id2:2), MyClass2(id2:3), MyClass2(id2:4)]
var tuples = Array(zip(array1, array2)) // *
tuples = tuples.sorted { (left, right) -> Bool in
    return left.1.id2 > right.1.id2
}

你的解决方案工作的原因是排序的序列产生一个数组。因此,您无法将数组重新分配给序列变量(tuples),但您可以将其分配给不同的变量(tuples2)。我的解决方案使用数组启动,因此生成的排序数组可以分配回同一个变量。

答案 1 :(得分:0)

您无法使用void allDiff(char** T, int taille) ,因为元组类型sorted()不符合(MyClass1, MyClass2),因此分拣机不知道如何对元组进行排序。您无法添加一个可以增加一致性的扩展程序,因为元组无法扩展或符合协议。

但是,您可以使用Comparable,这需要您提供一个闭包来定义元素之间的排序。

sorted(by:)