scala сортировка списка по параметру объекта ошибка - PullRequest
1 голос
/ 22 октября 2010

Хорошо, я бы не обратился к Вам за помощью, если бы знал, что делать, в любом случае, все еще бывали проблемы с моей "программой".

class Mark(val name: String, val style_mark: Double, val other_mark: Double) {}

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[Mark](m1, m2, m3, m4, m5, m6);

  def avg(xs: List[Double]) = xs.sum / xs.length

  val marksGrouped = marks.groupBy(_.name).map { kv => new Mark(kv._1, avg(kv._2.map(_.style_mark)), avg(kv._2.map(_.other_mark))) }

  val marksSorted = marksGrouped.sortWith((m1, m2) => m1._style_mark < m2._style_mark)

  }

И это ошибка, которую я получаю: error: value sortWith is not a member of scala.collection.immutable.Iterable[Mark]

Ответы [ 3 ]

6 голосов
/ 23 октября 2010

Основная иерархия коллекций:

  • TraversableOnce: может быть пройден только один раз, как итераторы.
  • Traversable: Может быть пройдено с foreach, но другие гарантии не предоставлены.
  • Iterable: может выдать iterator, что позволяет выполнять ленивый обход.
    • Seq: содержимое имеет фиксированный порядок обхода.
      • IndexedSeq: содержимое может быть эффективно получено по номеру позиции.
    • Set: содержимое содержит только один элемент каждого типа.
    • Map: содержимое может быть эффективно извлечено с помощью ключа.

Итак, проблема, с которой вы сталкиваетесь, заключается в том, что Iterable не предоставляет поддержки для определения порядка обхода, что делает sortWith. Только коллекции, полученные из Seq могут - List, Vector, ArrayBuffer и т. Д.

Метод toSeq вернет Seq из Iterable. Или вы можете выбрать более конкретную коллекцию с характеристиками , хорошо соответствующими вашему алгоритму.

6 голосов
/ 22 октября 2010

Сначала вам нужно будет позвонить toList на marksGrouped.Iterable не имеет sortWith метода, но List имеет.

4 голосов
/ 23 октября 2010

Для дополнительного совершенства программирования более высокого порядка используйте sortBy, а не sortWith

  val marksSorted = marksGrouped.toList.sortBy(_.style_mark)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...