Kotlin - data class i problem z petlą

Kotlin - data class i problem z petlą
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Lokalizacja:Zielonka
  • Postów:103
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.

Kopiuj
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".

Kopiuj
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ć.


edytowany 2x, ostatnio: Waran3
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 11 godzin
1
Kopiuj
(1..10).map { numer -> Zawodnicy("Z" + numer, 150) }

Ale co to ma wspolnego z sortowaniem? :P


λλλ
edytowany 4x, ostatnio: stivens
KamilAdam
Kurde, byłeś szybszy :(
stivens
Napisalem juz wczesniej ale usunalem. OP mnie nakierowal na dziwne rozwiazanie xD
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Lokalizacja:Zielonka
  • Postów:103
0

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

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


szweszwe
To dobrze, że kupy nie robiłeś xD Temat powinien opisywać problem a nie to co ogólnie porabiasz.
Waran3
No widzisz, chciałem dobrze a wyszło jak zawsze :-)
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:dzień
  • Lokalizacja:Kraków
  • Postów:1694
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:

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

albo w taki bardziej funkcyjny sposób:

Kopiuj
val zawodnicy = (1..10).map { number ->  Zawodnicy ("Z" + number, 150)}
Waran3
Super, wielkie dzięki za taki opis...
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 11 godzin
0

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

Ty sam nie masz pojecia co robisz :D


λλλ
Waran3
Sporo w tym prawdy :-)
Waran3
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Lokalizacja:Zielonka
  • Postów:103
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.


stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 11 godzin
2

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


λλλ
Waran3
Na razie walczę żeby to zadziałało...więc nazwy są na drugim planie. :-) Co do angielskich nazw...polskie są mi bliższe. :-)
stivens
Nie rozumiesz. Rade latwo zapamietac, nazwe latwo zmienic. W czym problem? :)
stivens
To w sumie kolejna rada: klikasz w IDE prawym przyciskiem myszki na nazwe klasy -> refactor -> rename :) podmieni nazwe w calym projekcie
Waran3
Każda rada na wagę złota. :-)...zmienione :-)

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.