Список 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 метод для объединения двух или более списков. Примеры приведены ниже:
Пример
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() для создания списка с указанным количеством повторяющихся элементов:
Пример
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. Примеры приведены ниже:Пример
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 используется для обращения порядка списка. Примеры приведены ниже:
Пример
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