English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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() для создания списка элементов с заданным количеством повторений:
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() создает список через заданную функцию.
Первый параметр метода — количество элементов, может быть двумерным, второй параметр — заданная функция, мы вычисляем результат через заданную функцию и вставляем значения в список, начальное значение 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 используется для переворота порядка элементов списка, пример приведен ниже:
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:
Номер | Методы и описание |
---|---|
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