Kotlin - data class i problem z petlą

0

Mam taki rekord bądź jak kto woli data class.
Chce wpisać tam cały ciąg danych, który potem potrzebuję odpowiednio posortować ( val sortowanie ).
Wszystko działa jak należy dopóki dane wpisuję ręcznie, czyli : Zawodnicy ("Z1",10), Zawodnicy ("Z2",150),Zawodnicy ("Z3",300)...tak jak to widać na poniższym fragmencie kodu.

data class Zawodnicy (val nazwa_zawodnika: String, val wynik_zawodnika: Int){}
                    for (numer in 1..10 ) {
                    val sortowanie = mutableListOf(
                    Zawodnicy ("Z1",10),
                    Zawodnicy ("Z2",150),
                    Zawodnicy ("Z3",300)
                    )}

Potrzebuję jednak te dane wprowadzić dynamicznie. Myślałem, że można wstawić jakoś pętlę tak jak poniżej ale wyrzuca coś w stylu: "for is not an expression".

data class Zawodnicy (val nazwa_zawodnika: String, val wynik_zawodnika: Int){}

                    val sortowanie = mutableListOf(
                        for (numer in 1..10 ) {
                            Zawodnicy("Z" + numer, 150)

                        })

Może ktoś podpowie jak to prawidłowo zapisać.

1
(1..10).map { numer -> Zawodnicy("Z" + numer, 150) }

Ale co to ma wspolnego z sortowaniem? :P

0

Do tego momentu nie ma nic wspólnego. Napisałem tak tylko żeby było wiadomo co robię :-)
Potem leci coś takiego:

 sortowanie.sortByDescending { it.wynik_zawodnika }
                    sortowanie.forEach{
                        print(it.nazwa_zawodnika + " ")
                        println(it.wynik_zawodnika)
                    }

1

Definicja metody mutable: public fun <T> mutableListOf(vararg elements: T): MutableList<T> =
Czyli oczekuje to obiektów jakiegoś typu T w twoim przypadku Zawodnicy. Co jest beznadziejną nazwą klasy swoją drogą.

Jak zawołasz Zawodnicy("Z1", 10) to tworzysz nowy obiekt Zawodnicy.
mutableListOf oczekuje obiektu jak już pisałem, więc w pierwszym przypadku wszystko działa jak należy

W drugim przypadku tworzysz sobie zawodników w pętli, ale przecież metoda mutableListOf nie wie, że jak tam jest pętla for to powinna wyciągnąć tworzone tam obiekty. W ogóle pętla for nic nie zwraca. Jak spróbujesz przypisać ją do czegoś to dostaniesz For is not an expression, and only expressions are allowed here

Możesz to zrobić w taki sposób. Czyli tworząc listę i w pętli dodając obiekty do listy:

val zawodnicy: MutableList<Zawodnicy> = mutableListOf()
    for (numer in 1..10) {
        zawodnicy.add(Zawodnicy("Z" + numer, 150))
}

albo w taki bardziej funkcyjny sposób:

val zawodnicy = (1..10).map { number ->  Zawodnicy ("Z" + number, 150)}
0

Napisałem tak tylko żeby było wiadomo co robię

Ty sam nie masz pojecia co robisz :D

1

Co jest beznadziejną nazwą klasy swoją drogą. <

No cóż robię wiele podobnych rzeczy ale pomimo to, ciągle do przodu. :-)
Wielkie dzięki za wyjaśnienia i podpowiedzi.

2

Dobrze to zeby bylo bardziej merotycznie. Nie Zawodnicy a Zawodnik. (angielskie nazwy juz sobie odpuscmy)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.