2017-06-17 3 views
0

ein sortiertes Array angezeigt Ich möchte die drei höchsten Werte mit den Namen zusammen angezeigt werdenSwift - mit Tasten

Mein Code:

let gradesofStudent = [ 
    "Elias Brown": 80, 
    "Baris Yan": 99, 
    "Christian Najm": 70, 
    "Sam Chakra": 90, 
    "Alain Elliot": 55, 
    "Georges Obama": 77, 
] 
    var y = " " 
    var name = " " 
func mainFunction(stDictionary: Dictionary<String, Int>) -> ArraySlice<String>{ 

     var emptyDic: [String: String] = [:] 


    for (keys, value) in gradesofStudent { 

    if value > 0 && value <= 59 {y = "F"} 
else if value >= 60 && value <= 69 {y = "D"} 
else if value >= 70 && value <= 79 {y = "C"} 
else if value >= 80 && value <= 89 {y = "B"} 
else {y = "A"} 
emptyDic[keys] = y 
    } 

var arrayGrades = (Array(emptyDic).sorted{$0.1 < $1.1}).map{(k,v) in return(k:v)} 
var firstThree = arrayGrades[0..<3] 

return(k: firstThree) 
} 
let v = mainFunction(stDictionary:gradesofStudent) 
print (v) 

ich die folgende Ausgabe bekommen:

[ "A", "A", "B"]

Was ich bekommen möchte, ist etwas wie ["Baris Yan": "A", "Sam Chakra": "A", "Elias Brown": "B "]

Da ich das Wörterbuch nicht direkt sortieren kann, kann ich mir nicht vorstellen, wie ich die Namen anzeigen soll.

+1

Sie können Ihr Leben so viel einfacher gestalten, wenn Sie einen 'struct Student' mit' var name: String', 'var grade: Int' members, berechnete Eigenschaft' var letterRepresentation: String {...} 'und einem ** verwenden würden. Array ** von Instanzen. Übrigens: Ein Wörterbuch ist per Definition ungeordnet. – vadian

+0

Swift 2 oder 3? Ihr Code gibt einen Fehler in Swift 3 –

Antwort

2

Mein zwei Cent (nach dem Kommentar)

struct Student { 
    let name : String 
    let grade : Int 

    var letterRepresentation : String { 
     switch grade { 
     case 0..<60 : return "F" 
     case 60..<70 : return "D" 
     case 70..<80 : return "C" 
     case 80..<90 : return "B" 
     default : return "A" 
     } 
    } 
} 

let gradesofStudent = [Student(name: "Elias Brown", grade: 80), 
         Student(name: "Baris Yan", grade: 99), 
         Student(name: "Christian Najm", grade: 70), 
         Student(name: "Sam Chakra", grade: 90), 
         Student(name: "Alain Elliot", grade: 55), 
         Student(name: "Georges Obama", grade: 77)] 

let threeHighestGrades = gradesofStudent.sorted(by: {$0.grade > $1.grade}).prefix(3) 

print(threeHighestGrades.map({"\($0.name) - \($0.letterRepresentation)"})) 
// ["Baris Yan - A", "Sam Chakra - A", "Elias Brown - B"] 

Gibt es keinen Brief E?

+0

Silly Tippfehler: Ihr 'Schalter' wird" A "den Noten' 69' und '79' geben. –

+0

Hoppla. Vielen Dank @PauloMattos – vadian

1

Der folgende Code-Schnipsel würden Sie das genaue Ergebnis benötigen Sie:

lassen gradesofStudent = [ "Elias Brown": 80, "Baris Yan": 99, "Christian Najm": 70, "Sam Chakra": 90, "Alain Elliot": 55, "Georges Obama": 77, ]

var y = ""

var name = ""

func Hauptfunktion (stDictionary: Dictionary) -> ArraySlice < [String: String]> {

var emptyDic: [String: String] = [:] 


for (keys, value) in gradesofStudent { 

    if value > 0 && value <= 59 {y = "F"} 
    else if value >= 60 && value <= 69 {y = "D"} 
    else if value >= 70 && value <= 79 {y = "C"} 
    else if value >= 80 && value <= 89 {y = "B"} 
    else {y = "A"} 
    emptyDic[keys] = y 
} 

var arrayGrades = emptyDic.sorted{$0.1 < $1.1}.map{(k,v) in return[k:v]} 
var firstThree = arrayGrades[0..<3] 
return(firstThree) 

}

let v = Hauptfunktion (stDictionary: gradesofStudent) print (v)