English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala List (список)

Сборники Scala

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

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

// Список строк
val site: List[String] = List("w3codebox", "Google", "Baidu")
// Список целых чисел
val nums: List[Int] = List(1, 2, 3, 4)
// Пустой список
val empty: List[Nothing] = List()
// Двумерный список
val dim: List[List[Int]] =
   List(
      List(1, 0, 0),
      List(0, 1, 0),
      List(0, 0, 1)
   )

Два базовых элемента, из которых строятся списки: Nil и ::

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

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

// Список строк
val site = "w3codebox" :: ("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 = "w3codebox" :: ("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 
Первый сайт: w3codebox
Последний сайт: List(Google, Baidu)
Проверка списка site на пустоту: false
Проверить, пуст ли nums : true

для подключения списков

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

object Test {
   def main(args: Array[String]) {
      val site1 = "w3codebox" :: ("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(w3codebox, Google, Baidu, Facebook, Taobao)
site1.:::(site2) : List(Facebook, Taobao, w3codebox, Google, Baidu)
List.concat(site1, site2) : List(w3codebox, Google, Baidu, Facebook, Taobao)

List.fill()

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

object Test {
   def main(args: Array[String]) {
      val site = List.fill(3)("w3codebox") // 重复 w3codebox 3 次
      println("site : " + site)
      val num = List.fill(10)(2) // 重复元素 2, 10 次
      println("num : " + num)
   }
}

Выполните приведенный код, результат вывода будет следующим:

$ vim Test.scala 
$ scala Test.scala 
site : List(w3codebox, w3codebox, w3codebox)
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( "Одномерный : " + 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 = "w3codebox" :: ("Google" :: ("Baidu" :: Nil))
      println( "site до переворота : " + site )
      println( "site взятый в обратном порядке : " + site.reverse )
   }
}

Выполните приведенный код, результат вывода будет следующим:

$ vim Test.scala 
$ scala Test.scala 
site до переворота : List(w3codebox, Google, Baidu)
site взятый в обратном порядке : List(Baidu, Google, w3codebox)

Наиболее常用的 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

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

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

44

def toSeq: Seq[A]

Преобразование списка в seq

45

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

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

46

def toString(): String

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

Более подробную информацию можно найти Документация API

Сборники Scala