Список Scala

Scala 集合Коллекции в Scala

Списки Scala похожи на массивы тем, что все элементы имеют один и тот же тип, но они также различны: списки неизменяемы, то есть после того как значение определено, его нельзя изменить, и списки имеют рекурсивную структуру (т. е. структуру связанного списка), тогда как массивы — нет.

Тип элемента T списка можно записать как List[T]. Например, ниже перечислены различные типы списков:

Пример

// Список строк
val site: List[String] = List("Example", "Google", "Baidu")

// Список целых чисел
val nums: List[Int] = List(1, 2, 3, 4)

// Пустой список
val empty: List[Nothing] = List()

// Двумерный список
val dim: List[List[Int]] =
   Список(
      Список(1, 0, 0),
      Список(0, 1, 0),
      Список(0, 0, 1)
   )

Две базовые единицы для построения списка — это Nil и ::Nilи::

NilЭто также можно представить как пустой список.

Приведённый выше пример можно записать следующим образом:

Пример

// Список строк
val site = "Example" :: ("Google" :: ("Baidu" :: Nil))

// Список целых чисел
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))

// Пустой список
val empty = Nil

// Двумерный список
val dim = (1 :: (0 :: (0 :: Nil))) ::
          (0 :: (1 :: (0 :: Nil))) ::
          (0 :: (0 :: (1 :: Nil))) :: Nil

Основные операции со списками

Списки Scala имеют три базовые операции:

  • headВозвращает первый элемент списка
  • tailВозвращает список, содержащий все элементы, кроме первого
  • isEmptyВозвращает true, когда список пуст

Любая операция над списками Scala может быть выражена с помощью этих трёх базовых операций. Примеры приведены ниже:

Пример

// Список строк
object Test {
   def main(args: Array[String]) {
      val site = "Example" :: ("Google" :: ("Baidu" :: Nil))
      val nums = Nil

      println( "Первый сайт: " + site.head )
      println( "Последний сайт: " + site.tail )
      println( "Проверка, пуст ли список site: " + site.isEmpty )
      println( "Проверка, пуст ли nums: " + nums.isEmpty )
   }
}

Выполнение приведенного выше кода дает следующий вывод:

$ vim Test.scala 
$ scala Test.scala 
第一网站是 : Example
最后一个网站是 : List(Google, Baidu)
查看列表 site 是否为空 : false
查看 nums 是否为空 : true

Конкатенация списков

Вы можете использовать:::::: оператор илиList.:::()List.:::() метод илиList.concat()concat метод для объединения двух или более списков. Примеры приведены ниже:

Пример

object Test {
   def main(args: Array[String]) {
      val site1 = "Example" :: ("Google" :: ("Baidu" :: Nil))
      val site2 = "Facebook" :: ("Taobao" :: Nil)

      // Использование оператора :::
      var fruit = site1 ::: site2
      println( "site1 ::: site2 : " + fruit )
     
      // Использование метода List.:::()
      fruit = site1.:::(site2)
      println( "site1.:::(site2) : " + fruit )

      // Использование метода concat
      fruit = List.concat(site1, site2)
      println( "List.concat(site1, site2) : " + fruit  )
     

   }
}

Выполнение приведенного выше кода дает следующий вывод:

$ vim Test.scala 
$ scala Test.scala 
site1 ::: site2 : List(Example, Google, Baidu, Facebook, Taobao)
site1.:::(site2) : List(Facebook, Taobao, Example, Google, Baidu)
List.concat(site1, site2) : List(Example, Google, Baidu, Facebook, Taobao)

List.fill()

Мы можем использовать метод List.fill() для создания списка с указанным количеством повторяющихся элементов:

Пример

object Test {
   def main(args: Array[String]) {
      val site = List.fill(3)("Example") // Повторить Пример 3 раза
      println( "site : " + site  )

      val num = List.fill(10)(2)         // Повторить элемент 2, 10 раз
      println( "num : " + num  )
   }
}

Выполнение приведенного выше кода дает следующий вывод:

$ vim Test.scala 
$ scala Test.scala 
site : List(Example, Example, Example)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

List.tabulate()

Метод List.tabulate() создает список, используя заданную функцию.

Первый параметр метода — количество элементов, которое может быть двумерным; второй параметр — заданная функция. Мы вычисляем результат с помощью заданной функции и вставляем возвращаемое значение в список, начиная с 0. Примеры приведены ниже:

Пример

object Test {
   def main(args: Array[String]) {
      // Создать 5 элементов, используя заданную функцию
      val squares = List.tabulate(6)(n => n * n)
      println( "One-dimensional: " + squares  )

      // Создать двумерный список
      val mul = List.tabulate( 4,5 )( _ * _ )      
      println( "Многомерный: " + mul  )
   }
}

Выполнение приведенного выше кода дает следующий вывод:

$ vim Test.scala 
$ scala Test.scala 
一维 : List(0, 1, 4, 9, 16, 25)
多维 : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))

List.reverse

List.reverse используется для обращения порядка списка. Примеры приведены ниже:

Пример

object Test {
   def main(args: Array[String]) {
      val site = "Example" :: ("Google" :: ("Baidu" :: Nil))
      println( "Перед реверсом site: " + site )

      println( "После реверса site: " + site.reverse )
   }
}

Выполнение приведенного выше кода дает следующий вывод:

$ vim Test.scala 
$ scala Test.scala 
site 反转前 : List(Example, Google, Baidu)
site 反转后 : List(Baidu, Google, Example)

Общие методы Scala List

В следующей таблице перечислены общие методы для Scala List:

Нет. Метод и описание
1

def +:(elem: A): List[A]

Добавляет элемент в начало списка

scala> val x = List(1)
x: List[Int] = List(1)

scala> val y = 2 +: x
y: List[Int] = List(2, 1)

scala> println(x)
List(1)
2

def ::(x: A): List[A]

Добавляет элемент в начало списка

3

def :::(prefix: List[A]): List[A]

Добавляет элементы указанного списка в начало списка

4

def :+(elem: A): List[A]

Копирует список после добавления элементов

scala> val a = List(1)
a: List[Int] = List(1)

scala> val b = a :+ 2
b: List[Int] = List(1, 2)

scala> println(a)
List(1)
5

def addString(b: StringBuilder): StringBuilder

Добавляет все элементы списка в StringBuilder

6

def addString(b: StringBuilder, sep: String): StringBuilder

Добавляет все элементы списка в StringBuilder с указанным разделителем

7

def apply(n: Int): A

Получает элемент по индексу списка

8

def contains(elem: Any): Boolean

Проверяет, содержит ли список указанный элемент

9

def copyToArray(xs: Array[A], start: Int, len: Int): Unit

Копирует элементы списка в массив

10

def distinct: List[A]

Удаляет повторяющиеся элементы из списка и возвращает новый список

11

def drop(n: Int): List[A]

Отбрасывает первые n элементов и возвращает новый список

12

def dropRight(n: Int): List[A]

Отбрасывает последние n элементов и возвращает новый список

13

def dropWhile(p: (A) => Boolean): List[A]

Отбрасывает элементы слева направо, пока условие p не перестанет выполняться

14

def endsWith[B](that: Seq[B]): Boolean

Проверяет, заканчивается ли список указанной последовательностью

15

def equals(that: Any): Boolean

Определяет, равны ли они

16

def exists(p: (A) => Boolean): Boolean

Проверяет, существует ли в списке элемент, удовлетворяющий указанному условию

Проверяет, содержит ли список l некоторый элемент

scala> l.exists(s => s == "Hah")
res7: Boolean = true
17

def filter(p: (A) => Boolean): List[A]

Выводит все элементы, удовлетворяющие заданному условию

Исключает элементы длиной 3

scala> l.filter(s => s.length == 3)
res8: List[String] = List(Hah, WOW)
18

def forall(p: (A) => Boolean): Boolean

Проверяет все элементы

Например: проверяет, все ли элементы начинаются с "H"

scala> l.forall(s => s.startsWith("H")) res10: Boolean = false
19

def foreach(f: (A) => Unit): Unit

Применяет функцию ко всем элементам списка

20

def head: A

Возвращает первый элемент списка

21

def indexOf(elem: A, from: Int): Int

Находит позицию первого вхождения элемента, начиная с указанной позиции 'from'

22

def init: List[A]

Возвращает все элементы, кроме последнего

23

def intersect(that: Seq[A]): List[A]

Вычисляет пересечение нескольких коллекций

24

def isEmpty: Boolean

Проверяет, пуст ли список

25

def iterator: Iterator[A]

Создаёт новый итератор для перебора элементов

26

def last: A

Возвращает последний элемент

27

def lastIndexOf(elem: A, end: Int): Int

Находит позицию последнего вхождения элемента, начиная с указанной позиции 'end'

28

def length: Int

Возвращает длину списка

29

def map[B](f: (A) => B): List[B]

Пересчитывает все элементы с помощью заданного метода

30

def max: A

Находит наибольший элемент

31

def min: A

Находит наименьший элемент

32

def mkString: String

Отображает все элементы списка в виде строки

33

def mkString(sep: String): String

Отображает все элементы списка в виде строки с использованием разделителя

34

def reverse: List[A]

Обращает список

35

def sorted[B >: A]: List[A]

Сортирует список

36

def startsWith[B](that: Seq[B], offset: Int): Boolean

Проверяет, содержит ли список указанную последовательность в указанной позиции

37

def sum: A

Вычисляет сумму элементов коллекции

38

def tail: List[A]

Возвращает все элементы, кроме первого

39

def take(n: Int): List[A]

Извлекает первые n элементов списка

40

def takeRight(n: Int): List[A]

Извлекает последние n элементов списка

41

def toArray: Array[A]

Преобразует список в массив

42

def toBuffer[B >: A]: Buffer[B]

Возвращает буфер, содержащий все элементы списка

43

def toMap[T, U]: Map[T, U]

Преобразует List в Map

44

def toSeq: Seq[A]

Преобразует List в Seq

45

def toSet[B >: A]: Set[B]

Преобразует List в Set

46

def toString(): String

Преобразует список в строку

Для получения дополнительных методов обратитесь кдокументации API

Scala 集合Коллекции в Scala

Другие расширения