2017-09-28 1 views
-4

J'essaie de trier un tableau [[Character]] dans lequel des caractères aléatoires sont placés pour qu'il soit tout en ordre alphabétique. sortie ex pour le moment:Comment trier un tableau de caractères multidimensionnel par ordre alphabétique Swift

["H", "P", "C"] 
["F", "K", "V"] 
["J", "Y", "B"] 

je besoin d'être comme ce

["A", "B", "C"] 
["D", "E", "F"] 
["G", "H", "I"] 

Des idées?

+2

Comment A être le premier quand ce n'est pas dans l'un des tableaux? Ça n'a aucun sens. – matt

+0

C'était juste un échantillon de ce dont j'avais besoin, je veux dire que c'est censé être trié par ordre alphabétique – andrewF

+1

C'est _not_ un échantillon. Afficher l'entrée réelle et la sortie désirée réelle. Nous sommes programmeurs, pas mindreaders. - Ok ... Alors quel est le problème? Aplatir les tableaux, trier et diviser à nouveau en trois. Quelle est la partie difficile pour vous? – matt

Répondre

0

S'il vous plaît vérifier:

let input = [["H", "P", "C"], ["F", "K", "V"], ["J", "Y", "B"], ["A", "L"]] 
var sortedArray = input.flatMap({ $0 }).sorted() 

var finalArray:[[String]]=[] 
var subArray:[String]=[] 
for i in 0..<sortedArray.count { 
    subArray.append(sortedArray[i]) 
    if subArray.count == 3 || i == sortedArray.count-1 { 
     finalArray.append(subArray) 
     subArray = [] 
    } 
} 

print(finalArray) 
// Output : [["A", "B", "C"], ["F", "H", "J"], ["K", "L", "P"], ["V", "Y"]] 
0
func flattenArray(nestedArray: [[Character]]) -> [[Character]]{ 

var myFlattendArray = [Character]() 
var sortedArray = [[Character]]() 

for element in nestedArray{ 
    if element is [Character]{ 
     for char in element{ 
      myFlattendArray.append(char) 
     } 
    } 
} 
myFlattendArray = myFlattendArray.sorted(by: {$0 < $1}) 
var arrayForArray = [Character]() 
for i in 0..<myFlattendArray.count{ 
    if((i % nestedArray.count == 0 && i != 0)){ 
     sortedArray.append(arrayForArray) 
     arrayForArray.removeAll() 
    }else if i == myFlattendArray.count - 1{ 
     arrayForArray.append(myFlattendArray[i]) 
     sortedArray.append(arrayForArray) 
     arrayForArray.removeAll() 
    } 
    arrayForArray.append(myFlattendArray[i]) 

} 
    return sortedArray 
} 
0

Vous pouvez utiliser flatMap pour aplatir votre tableau, les trier et vous groupe peut en utilisant cette extension de cette answer comme suit:

extension Array { 
    func group(of n: IndexDistance) -> Array<Array> { 
     return stride(from: 0, to: count, by: n) 
      .map { Array(self[$0..<Swift.min($0+n, count)]) } 
    } 
} 

let arr = [["H", "P", "C"], 
      ["F", "K", "V"], 
      ["J", "Y", "B"]] 

let sorted = arr.flatMap{$0}.sorted().group(of: 3) 
sorted // [["B", "C", "F"], ["H", "J", "K"], ["P", "V", "Y"]]