Biorąc pod uwagę dwie tablice, gdzie jeden jest starym zestawem wartości, a drugi to nowe wartości, chcę znaleźć "różnicę" tych dwóch tablic, takie aktualizacje oryginalnej tablicy można przedstawić jako:Swift Array diff
enum CollectionChange<T: SequenceType> {
case Initial(T)
case Update(T, deletions: [Int], insertions: [Int], modifications: [Int])
}
Próbuję zbudować prostszą wersję this gdzie sprzeciwu zmiany jest zbudowany w oparciu o równości obiektu, zamiast indeksów jak RAC-MutableCollectionProperty
jest (dla których kod jest here i co może być najbardziej skomplikowany bit kod, który widziałem od dłuższego czasu, żadna dokumentacja nie pomaga).
Ważnym elementem tego projektu jest także możliwość obserwowania zmian w tablicy na dowolnym poziomie szczegółowości. Na przykład tablica jednowymiarowa, ograniczająca zakres od T
do Equatable
, jest stosunkowo łatwym przypadkiem użycia. Możesz, jako RAC-MutableCollectionProperty
, zbudować tabelę opisującą zmiany, sprawdzając równość obiektów. Jednak gdy przejdziesz do korzystania z tablic dwuwymiarowych i głębiej, staje się to trochę trudniejsze, ponieważ nie tylko musisz odróżniać elementy na najniższym poziomie, ale także opisywać przeprowadzanie na poziomie sekcji. W praktyce nie więcej niż tablice 2D są naprawdę potrzebne, ale dobrze byłoby mieć rozwiązanie działające niezależnie od głębokości tablicy. Niekoniecznie szukam rozwiązania (choć byłoby to fantastyczne), naprawdę tylko wszelkie wskazówki i rozwiązania na wysokim poziomie, jak podejść do tego problemu.
Jednym ze sposobów myślałem o obserwować wiele poziomów tablicy jest napisać funkcję diffing który działa na pojedynczych wymiarowych tablic i skonstruować własności takie, że:
let property: MutableCollectionProperty<MutableCollectionProperty<Int>>
którym nieruchomość byłoby sprawdzić, czy jej nazwę rodzajową typ jest tego samego typu. Musiałabym zmienić opis zmian do czegoś bliżej
enum Changes<T> {
case Initial(T)
case Update(T, deletions: [NSIndexPath], insertions: [NSIndexPath], modifications: [NSIndexPath])
}
czy może coś jak
enum Changes<T> {
case Initial(T)
case UpdateSections(sections: [T], deletions:[Int], insertions: [Int], modifications: [Int])
case UpdateIndexes(T, deletions: [Int], insertions: [Int], modifications: [Int])
}
Są to tylko moje wstępne przemyślenia jednak jestem otwarty na wszelkie rozwiązania lub sugestii.
BOUNTY Edycja:
Bounty otrzyma do kogoś, kto może stanowić rozwiązanie Biorąc pod uwagę następujące parametry:
- Niech X i Y są dwa szybkimi tablicy
- oba układy typu
T: Equatable
- obie tablice mogą być dowolnej głębokości
- głębokość x == głębokość y
zespół zmiany mogą być generowane w której zestaw zmiana opisuje:
- elementy, które zostały usunięte z X Y (o wskaźniku)
- elementy, które zostały wprowadzone do Y, że nie były w x (o wskaźniku)
- elementy, które zostały przeniesione począwszy od x do y (wskaźnikiem)
Zmiana s tylko muszą być opisane na najniższym poziomie macierzy (nie musisz się martwić wstawianiu & usuwania wyższych segmentów, chociaż tak naprawdę uzyskasz naprawdę z tego 300 rep), ale zmienne indeksy muszą wskazywać zagnieżdżoną ścieżkę indeksu.
Na przykład, jeśli tablica jest tablicą 3d, a obiekt o numerze array[0][5][2]
został usunięty, wynikiem zmiany indeksu powinna być tablica [0, 5, 2]
. Ta tablica opisuje pojedynczą delecję, a wszystkie usunięcia będą miały typ [[Int]]
.
Edit:
jestem usunięcie wymogu tablic będących dowolnej głębokości. Powiedzmy, że są to po prostu tablice 1d.
przeprosiny za formatowanie wiadomości , Zaktualizuję mój pierwotny wpis poprawnie sformatowaną wiadomością. – barndog
Być może zainteresuje Cię https://github.com/jflinter/Dwifft – onmyway133
Spojrzę (i prawdopodobnie skończę z tym), ale jestem również zainteresowany wiedząc, jak to zrobić sam. – barndog