Кто такой Scala способ найти, имеют ли все элементы Массива ту же длину?

Я плохо знаком с Scala и но очень стар к Java и имел некоторое понимание, работающее с языками FP как "Haskell".

Здесь я задаюсь вопросом, как реализовать это использование Scala. Существует список элементов в массиве, все они - строки, и я просто хочу знать, существует ли способ, которым я могу сделать это в Scala в FP путь. Вот моя текущая версия, которая работает...

def checkLength(vals: Array[String]): Boolean = {
  var len = -1
  for(x <- conts){
    if(len < 0)
      len = x.length()
    else{
      if (x.length() != len)
        return false
      else
        len = x.length()
    }
  }
  return true;
}

И я вполне уверен существует лучший способ сделать это в Scala/FP...

11
задан sth 8 February 2010 в 22:22
поделиться

5 ответов

list.forall( str => str.size == list(0).size )

Edit: Вот определение, которое является таким же общим, как и собственник, а также позволяет проверить, является ли свойство, отличное от длины, одинаковым для всех элементов:

def allElementsTheSame[T,U](f: T => U)(list: Seq[T]) = {
    val first: Option[U] = list.headOption.map( f(_) )
    list.forall( f(_) == first.get ) //safe to use get here!
}

type HasSize = { val size: Int }
val checkLength = allElementsTheSame((x: HasSize) => x.size)_

checkLength(Array( "123", "456") )

checkLength(List( List(1,2), List(3,4) ))
21
ответ дан 3 December 2019 в 01:51
поделиться

Поскольку все кажутся такими креативными, я тоже буду изобретателем. : -)

def checkLength(vals: Array[String]): Boolean = vals.map(_.length).removeDuplicates.size <= 1

Имейте в виду, removeDuplicates , скорее всего, будет называться отличным в Scala 2.8.

7
ответ дан 3 December 2019 в 01:51
поделиться

Если вы знаете, что ваши списки всегда непусты, хорошо работает прямой поиск. Если вы этого не сделаете, это легко добавить в:

list match {
  case x :: rest => rest forall (_.size == x.size)
  case _ => true
}

Теперь списки нулевой длины возвращают истину, а не генерируют исключения.

2
ответ дан 3 December 2019 в 01:51
поделиться

Вот другой подход:

def check(list:List[String]) = list.foldLeft(true)(_ && list.head.length == _.length)
1
ответ дан 3 December 2019 в 01:51
поделиться

По моему опыту, R является исключительно мощным языком в этих областях:

  1. Манипуляция и преобразование данных.

  2. Статистический анализ.

  3. Графика.

Но R ни в коем случае не является тройным пони. Я также применил этот язык к задачам, которые не полностью вписываются в вышеуказанные категории. Некоторые примеры:

  • Сценарий, помогающий в создании универсальных двоичных файлов OSX путем идентификации и сопоставления статических и динамических библиотек различных архитектур и последующего запуска результирующих групп через lipo .

  • Скрипты для соскребания информации с веб-страниц.

  • Набор сценариев для создания изображений с географической привязкой, разрезания изображений на наборы с помощью GDAL , формирования манифеста JSON , описывающего выходные данные, и загрузки результата на веб-сайт для немедленного дисплея с помощью OpenLayers .

Моя любимая часть использования R - это частота, с которой я могу сказать:

WHOA! Есть пакет, который делает ЭТО?!

-121--2066718-

Не могли бы вы также сделать:

class ContextException extends Exception {

    public $context;

    public function __construct($message = null, $code = 0, Exception $previous = null, $context=null) {
        parent::__construct($message, $code, $previous);
        $this->context = $context;
    }

    public function getContext() {
        return $this->context;
    }
}

Это позволило бы избежать необходимости создания экземпляра исключения, а затем выбросить его.

-121--4716927-

Наконечники: Используйте forall , чтобы определить, удовлетворяют ли все элементы в коллекции определенному предикату (например, равенство длины).

3
ответ дан 3 December 2019 в 01:51
поделиться
Другие вопросы по тегам:

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