I have two arrays:
@State var myInterests: [String] = ["Beer", "Food", "Dogs", "Ducks"]
@State var otherInterests: [String] = ["Ducks", "Baseball", "Beer", "Pasta"]
I need to display a list with all shared interests listed first (top of the list), and then the others after.
ForEach(interests, id: \.self) { tag in
Text(tag)
}
The result for otherInterests should be something like:
["Ducks", "Beer", "Baseball", "Pasta"]
Is there any way of sorting the array to move the shared interests to the front of the array and the remaining ones after?
1 Answer 1
As long as the order of the subitems is not that important (you can sort each sublist to make sure consistent output) - a simple solution can be to use sets here!
Something like this
let myInterests: [String] = ["Beer", "Food", "Dogs", "Ducks"]
let otherInterests: [String] = ["Ducks", "Baseball", "Beer", "Pasta"]
// This will result only in the shared interests between my and other
let sharedInterests = Set(myInterests).intersection(Set(otherInterests))
// This will result in only the not shared interests
let resetOfOtherInterest = Set(otherInterests).subtracting((Set(sharedInterests)))
// Here we combine the two (which are disjoint!)
let newOtherInterest = Array(sharedInterests) + Array(resetOfOtherInterest)
print(newOtherInterest)
newOtherInterest = ["Ducks", "Beer", "Baseball", "Pasta"]
answered Aug 24, 2022 at 21:22
-
1Perhaps worth noting: this is an astable sorting algorithm. The relative positions between say "beer" and "ducks" won't be preservedAlexander– Alexander2022年08月24日 21:26:38 +00:00Commented Aug 24, 2022 at 21:26
-
Set object is an unordered collection type so the output won't always be the sameOmer Tekbiyik– Omer Tekbiyik2022年08月24日 21:26:43 +00:00Commented Aug 24, 2022 at 21:26
-
True, But there was no definition on how to order the shared interest, a simple sort can do that... Nevertheless @Alexander comment on the question itself provide a solution, in case of keeping the original order it is preferable!CloudBalancing– CloudBalancing2022年08月24日 21:29:12 +00:00Commented Aug 24, 2022 at 21:29
-
1@CloudBalancing It might be fine, or it might not, it depends on OP's goals. Sorting the result can give a consistent output, but if keeping most of the original is what he's after, that order would be hard to "bring back"Alexander– Alexander2022年08月24日 21:45:34 +00:00Commented Aug 24, 2022 at 21:45
-
True that is why I considered your solution preferableCloudBalancing– CloudBalancing2022年08月24日 21:46:33 +00:00Commented Aug 24, 2022 at 21:46
lang-swift
@State
,ForEach
,Text
). I think this is a perfect fit for your problem: stackoverflow.com/a/43056896/3141234