В Java я делал что-то вроде:
Код: Выделить всё
myArray.sort( new Comparator() {
public int compare(MyClass obj1, MyClass obj2) {
... (return 1, -1, or zero)
}
}
В Swift существует простой синтаксис:
Код: Выделить всё
myArray.sort(by: {
... (return true or false)
})
... (return .orderedAscending, .orderedDescending, or .orderedSame)
}
}
[/code]
Но здесь .orderedSame, похоже, ведет себя по-другому: когда идентифицируются два объекта .orderedSame, они считаются находящимися на одном уровне, и сортировщик больше не будет пытаться сравнить их с другими элементы.
Есть ли в Swift что-то, позволяющее получить тот же алгоритм, что и в Java, с возможностью сказать «эти два элемента несопоставимы»?
Примером использования является случай, когда, имея набор объектов с зависимостями (дерево), у нас есть все узлы в массиве, и мы хотим упорядочить узлы в зависимости от зависимостей (сначала корень дерева, а затем мы уверены, что мы никогда не помещаем узел A перед другим узлом B, если B зависит от A.
Например:
Код: Выделить всё
struct Node {
let subNodes: [Node]
}
let node1_1 = Node(subNodes: [])
let node1_2 = Node(subNodes: [])
let node2_1 = Node(subNodes: [])
let node2_2 = Node(subNodes: [])
let node1 = Node(subNodes: [node1_1, node1_2])
let node2 = Node(subNodes: [node2_1, node2_2])
let nodeRoot = Node(subNodes: [node1, node2])
let allNodes: [Node] = [node2_2, node1_1, node1, node1_2, nodeRoot, node2_1, node2]
]
Код: Выделить всё
nodeRoot, node1, node1_1, node1_2, node2, node2_1, node2_2
Код: Выделить всё
nodeRoot, node1, node2, node1_1, node1_2, node2_1, node2_2
но не
Код: Выделить всё
nodeRoot, node1, node2_2, node2, node1_1, node1_2, node2_1
Надеюсь, я понятно
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/786 ... management