Как в Scala для нахождения уникальных объектов в Списке

Разработка и 'тестирование' на локальной машине в порядке, но качественное тестирование должно быть выполнено в системе отражения целевая среда, т.е. безо всех средств разработки, и т.д. установленных.

Это поможет избежать, 'хорошо это работает над моей машиной' ситуации.

76
задан Volodymyr Bezuglyy 8 October 2009 в 15:37
поделиться

5 ответов

Две причины не использовать отладчик:

  • На клиентском компьютере, где происходит сбой, не установлен отладчик
  • Вы не можете позволить себе остановить ( live) (на клиентском компьютере), чтобы проверить его с помощью отладчика

Я не знаю, являюсь ли я «программистом такого рода», но я не понимаю, что вам нужно от отладчика, кроме:

  • Прерывание в точке останова и / или прерывание при возникновении исключения
  • Проверять данные и проверять стек вызовов во время прерывания

Я слышал, что некоторые люди предлагают вам выполнить код с помощью отладчика, когда вы его пишете, поскольку своего рода проверка кода, но я этого не делаю.

implicit def listToSyntax[A](ls: List[A]) = new {
  def unique = unique(ls)
}

List(1, 1, 2, 3, 4, 5, 4).unique    // => List(1, 2, 3, 4, 5)
22
ответ дан 24 November 2019 в 11:04
поделиться

Если вы обратитесь к Rosetta Code: Создайте последовательность уникальных элементов

val list = List(1,2,3,4,2,3,4,99)
val l2 = list.removeDuplicates
// l2: scala.List[scala.Int] = List(1,2,3,4,99)

Поскольку List неизменяем, вы не будете изменять исходный List , вызвав removeDuplicates

Предупреждение: как упомянуто в этом твите (!), Это не сохраняет порядок:

scala> val list = List(2,1,2,4,2,9,3)
list: List[Int] = List(2, 1, 2, 4, 2, 9, 3)

scala> val l2 = list.removeDuplicates
l2: List[Int] = List(1, 4, 2, 9, 3)

Для Seq это метод должен быть доступен в Scala2.8, согласно билету 929 .
А пока вам нужно будет определить специальный статический метод как , показанный здесь

10
ответ дан 24 November 2019 в 11:04
поделиться

Установите собственный фильтр uniq с сохранением порядка:

scala> val l = List(1,2,3,3,4,6,5,6)
l: List[Int] = List(1, 2, 3, 3, 4, 6, 5, 6)

scala> l.foldLeft(Nil: List[Int]) {(acc, next) => if (acc contains next) acc else next :: acc }.reverse
res0: List[Int] = List(1, 2, 3, 4, 6, 5)
12
ответ дан 24 November 2019 в 11:04
поделиться

Простой специальный метод - просто добавить список в набор и использовать оттуда:

  val l = List(1,2,3,3,3,4,5,5,6,7,8,8,8,9,9)
  val s = Set() ++ x
  println(s)

Производит:

> Set(5, 1, 6, 9, 2, 7, 3, 8, 4)

Это работает для Seq (или любого Iterable), но это не обязательно в версии 2.8, где метод removeDuplicates, вероятно, будет более читабельным. Кроме того, не уверен в производительности во время выполнения по сравнению с более продуманным преобразованием.

Также обратите внимание на потерянный порядок.

2
ответ дан 24 November 2019 в 11:04
поделиться

В 2.8 это:

List(1,2,3,2,1).distinct  // => List(1, 2, 3)
204
ответ дан 24 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: