einen [Int: [Int]]
Wörterbuch Nutzen seine Spur des größten Array durch den Schlüssel für den angegebenen Wert zu halten.
let arrays = [[2], [3], [2, 2], [5], [7], [2, 2, 2], [3, 3]]
var largest = [Int: [Int]]()
for arr in arrays {
// Get the first value from the array
if let first = arr.first {
// current is the count for that key already in dictionary largest
// If the key isn't found, the nil coalescing operator ?? will
// return the default count of 0.
let current = largest[first]?.count ?? 0
// If our new array has a larger count, put it in the dictionary
if arr.count > current {
largest[first] = arr
}
}
}
// Convert the dictionary's values to an array for the final answer.
let result = Array(largest.values)
print(result) // [[5], [7], [2, 2, 2], [3, 3]]
Dieselbe Logik mit reduce
verwendet werden kann, um das Ergebnis in einer Zeile zu bieten:
let result = arrays.reduce([Int: [Int]]()) { var d = $0; guard let f = $1.first else { return d }; d[f] = d[f]?.count > $1.count ? d[f] : $1; return d }.map { $1 }
Andere Version
Diese Version verwendet ein [Int: Int]
Wörterbuch um nur die Anzahl zu halten das größte Array, das für jeden Schlüssel gefunden wurde, und rekonstruiert dann die Arrays am Ende mithilfe eines Array-Konstruktors.
let arrays = [[2], [3], [2, 2], [5], [7], [2, 2, 2], [3, 3]]
var counts = [Int: Int]()
for arr in arrays {
if let first = arr.first {
counts[first] = max(counts[first] ?? 0, arr.count)
}
}
let result = counts.map { [Int](count: $1, repeatedValue: $0) }
print(result) // [[5], [7], [2, 2, 2], [3, 3]]
Dieselbe Logik kann mit reduce
verwendet werden, um das Ergebnis in einer Zeile zu bieten:
let result = arrays.reduce([Int: Int]()) { var d = $0; guard let f = $1.first else { return d }; d[f] = max(d[f] ?? 0, $1.count); return d }.map { [Int](count: $1, repeatedValue: $0) }
Sie werden präziser sein. Möchten Sie, dass dies stabil ist (unter Beibehaltung der ursprünglichen Reihenfolge), was sollte mit Duplikaten geschehen? Ich nehme an, dass Sie nur Arrays mit der höchsten Anzahl übrig haben wollen. – ColGraff
Die Reihenfolge spielt keine Rolle, ich habe meine Frage bearbeitet, um sie klarer zu machen. Ja, nur die Arrays mit der höchsten Anzahl. – JKT