В основном я не являюсь поклонником Java/Scala, но, к сожалению, я вынужден использовать его для учебы. В любом случае мне дали задание:scala список объектов, используя groupBy со средним значением
Что такое программа, это список объектов, таких как: Mark(val name String, val style_mark Int, val other_mark Int)
.
Как я могу использовать groupBy для группировки меток по имени и получения среднего значения для style_mark и other_mark?
Mark("John", 2, 5)
Mark("Peter", 3, 7)
Mark("John", 4, 3)
Если вернуться:
Mark("John", 3, 4)
Mark("Peter", 3, 7)
Вот код:
class Mark(val name: String, val style_mark: Int, val other_mark: Int) {}
object Test extends Application
{
val m1 = new Mark("Smith", 18, 16);
val m2 = new Mark("Cole", 14, 7);
val m3 = new Mark("James", 13, 15);
val m4 = new Mark("Jones", 14, 16);
val m5 = new Mark("Richardson", 20, 19);
val m6 = new Mark("James", 4, 18);
val marks = List(m1, m2, m3, m4, m5, m6);
def avg(xs: List[Int]) = xs.sum/xs.length
marks.groupBy(_.name).map { kv => Mark(kv._1, avg(kv._2.map(_.style_mark)), avg(kv._2.map(_.other_mark))) }
println(marks);
}
Любая помощь будет высоко оценен,
Пол
Спасибо за ответ, я как бы понял. Обновленный мой вопрос с кодом, который я правильно знаю, но он дает мне ошибку 'error: not found: value Mark' at' Mark (kv._1, ... ' – PawelMysior
@Pawel: Если' Mark' не является case class, вам нужно написать 'new Mark (bla, bla, bla)' вместо 'Mark (bla, bla, bla)'. – sepp2k
@Pawel: Также обратите внимание, что значение 'меток' останется неизменным, так что вы должен печатать возвращаемое значение выражения, а не значение «меток». (Хотя проще проверить код в REPL, чем создать файл и запустить его, и в этом случае вы можете просто ввести выражение и увидеть его результат) – sepp2k