MaxBy() mai multe atribute ale obiectelor din Listă()

0

Problema

Spune că am o listă de cărți

val books = List(Book)

în cazul în care Book(bookID: String, bookName: String) și o hartă

val scores = Map(bookID -> score:float)

Mi-ar place pentru a obține cartea cu cel mai mare score în primul rând, apoi în ordine alfabetică de bookName

Obtinerea cartea cu cea mai mare evaluat scorul este destul de simplu:

val bestBook = books.maxBy(x => score(x.bookID))

Dar în cazul în care de mai multe cărți cu același scor atunci mi-ar place la fel de bookName. Nu sunt sigur cum de a adăuga un al doilea criteriu pentru maxBy? Cred că pot maxBy() scorul în primul rând, atunci am prelua scorul de bestBookși filtru books cu punctajul maxim, apoi minBy() la bookName?

Dar asta mi se pare foarte greoaie, există o modalitate mai eficientă de a face acest lucru? Am văzut anterior fire care face ceva similar cu Ordering implicit: Scala de Comanda de mai multe valori, dar nu am putut da seama cum de a defini Ordering în acest context.

implicit maxby scala
2021-10-23 09:21:53
1

Cel mai bun răspuns

3

Folosind maxBy cu atât mai mare punctaj (datorită - pe de scor) și numele:

books
  .maxBy(b => (-score(b.bookId), b.name))

Același comanda pe tuplu poate fi folosit pentru sortarea, dacă este necesar.

2021-10-23 15:43:26

ah eu nu cred de asta, dar în termeni de performanță, nu sortBy va fi O(nlog n) în timp ce maxBy este O(n) (cred?)
jeb2

Corect, puteți utiliza aceeași abordare cu maxBy pe un tuplu.
Gaël J

Nu recomand pentru un simplu max funcționare.
Tim

Sigur, editate post :)
Gaël J

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................