Scala Set (коллекция)
Scala Set — это коллекция объектов без дубликатов; все элементы уникальны.
Коллекции Scala делятся на изменяемые и неизменяемые коллекции.
По умолчанию Scala использует неизменяемые коллекции. Если вы хотите использовать изменяемые коллекции, вам нужно обратиться к пакетуscala.collection.mutable.Set.
По умолчанию используется scala.collection.immutable.Set. Пример неизменяемой коллекции приведён ниже:
Пример
println(set.getClass.getName) //
println(set.exists(_ % 2 == 0)) //true
println(set.drop(1)) //Set(2,3)
Если вам нужно использовать изменяемые коллекции, необходимо импортировать scala.collection.mutable.Set:
Пример
val mutableSet = Set(1,2,3)
println(mutableSet.getClass.getName) // scala.collection.mutable.HashSet
mutableSet.add(4)
mutableSet.remove(1)
mutableSet += 5
mutableSet -= 2
println(mutableSet) // Set(5, 3, 4)
val another = mutableSet.toSet
println(another.getClass.getName) // scala.collection.immutable.Set
Примечание:Хотя и изменяемый Set, и неизменяемый Set имеют операции для добавления или удаления элементов, между ними есть очень большая разница. Работа с неизменяемым Set создаёт новое множество, а исходное множество остаётся неизменным, как и List. Работа с изменяемым Set, однако, изменяет сам Set, подобно ListBuffer.
Основные операции Set
Коллекции Scala имеют три основные операции:
-
headВозвращает первый элемент коллекции -
tailВозвращает коллекцию, содержащую все элементы, кроме первого -
isEmptyВозвращает true, когда коллекция пуста
Любая операция над коллекциями Scala может быть выражена с помощью этих трёх основных операций. Пример:
Пример
def main(args: Array[String]) {
val site = Set("Example", "Google", "Baidu")
val nums: Set[Int] = Set()
println( "Первый сайт: " + site.head )
println( "Последний сайт : " + site.tail )
println( "Проверить, пуст ли список site : " + site.isEmpty )
println( "Проверить, пуст ли nums : " + nums.isEmpty )
}
}
Выполнение приведенного выше кода дает следующий вывод:
$ vim Test.scala $ scala Test.scala 第一网站是 : Example 最后一个网站是 : Set(Google, Baidu) 查看列表 site 是否为空 : false 查看 nums 是否为空 : true
Конкатенация множеств
Вы можете использовать++оператор илиSet.++()метод для конкатенации двух множеств. Если есть повторяющиеся элементы, они будут удалены. Пример:
Пример
def main(args: Array[String]) {
val site1 = Set("Example", "Google", "Baidu")
val site2 = Set("Faceboook", "Taobao")
// ++ используется как оператор
var site = site1 ++ site2
println( "site1 ++ site2 : " + site )
// ++ используется как метод
site = site1.++(site2)
println( "site1.++(site2) : " + site )
}
}
Выполнение приведенного выше кода дает следующий вывод:
$ vim Test.scala $ scala Test.scala site1 ++ site2 : Set(Faceboook, Taobao, Google, Baidu, Example) site1.++(site2) : Set(Faceboook, Taobao, Google, Baidu, Example)
Поиск наибольшего и наименьшего элементов в множестве
Вы можете использоватьSet.minметод, чтобы найти наименьший элемент в множестве, используйтеSet.maxметод, чтобы найти наибольший элемент в множестве. Пример:
Пример
def main(args: Array[String]) {
val num = Set(5,6,9,20,30,45)
// Найти наибольший и наименьший элементы в множестве
println( "Минимальный элемент в Set(5,6,9,20,30,45) : " + num.min )
println( "Максимальный элемент в Set(5,6,9,20,30,45) : " + num.max )
}
}
Выполнение приведенного выше кода дает следующий вывод:
$ vim Test.scala $ scala Test.scala Set(5,6,9,20,30,45) 集合中的最小元素是 : 5 Set(5,6,9,20,30,45) 集合中的最大元素是 : 45
Пересечение
Вы можете использоватьSet.&метод илиSet.intersectметод для просмотра элементов пересечения двух множеств. Пример:
Пример
def main(args: Array[String]) {
val num1 = Set(5,6,9,20,30,45)
val num2 = Set(50,60,9,20,35,55)
// Пересечение
println( "num1.&(num2) : " + num1.&(num2) )
println( "num1.intersect(num2) : " + num1.intersect(num2) )
}
}
Выполнение приведенного выше кода дает следующий вывод:
$ vim Test.scala $ scala Test.scala num1.&(num2) : Set(20, 9) num1.intersect(num2) : Set(20, 9)
Общие методы Scala Set
В следующей таблице перечислены часто используемые методы Scala Set:
| Нет. | Метод и описание |
|---|---|
| 1 |
def +(elem: A): Set[A] Добавляет новый элемент x в множество и создаёт новое множество, если элемент ещё не существует |
| 2 |
def -(elem: A): Set[A] Удаляет элементы из множества и создаёт новое множество |
| 3 |
def contains(elem: A): Boolean Возвращает true, если элемент существует в множестве, иначе false. |
| 4 |
def &(that: Set[A]): Set[A] Возвращает пересечение двух множеств |
| 5 |
def &~(that: Set[A]): Set[A] Возвращает разность двух множеств |
| 6 |
def +(elem1: A, elem2: A, elems: A*): Set[A] Создаёт новую неизменяемую коллекцию, добавляя элементы из указанной коллекции |
| 7 |
def ++(elems: A): Set[A] Объединяет две коллекции |
| 8 |
def -(elem1: A, elem2: A, elems: A*): Set[A] Создаёт новую неизменяемую коллекцию, удаляя элементы, содержащиеся в указанной коллекции |
| 9 |
def addString(b: StringBuilder): StringBuilder Добавляет все элементы неизменяемой коллекции в строковый буфер |
| 10 |
def addString(b: StringBuilder, sep: String): StringBuilder Добавляет все элементы неизменяемой коллекции в строковый буфер, используя указанный разделитель |
| 11 |
def apply(elem: A) Проверяет, содержит ли коллекция указанный элемент |
| 12 |
def count(p: (A) => Boolean): Int Подсчитывает количество элементов коллекции, удовлетворяющих заданному условию |
| 13 |
def copyToArray(xs: Array[A], start: Int, len: Int): Unit Копирует элементы неизменяемой коллекции в массив |
| 14 |
def diff(that: Set[A]): Set[A] Сравнивает разность двух множеств |
| 15 |
def drop(n: Int): Set[A]] Возвращает новую коллекцию с отброшенными первыми n элементами |
| 16 |
def dropRight(n: Int): Set[A] Возвращает новую коллекцию с отброшенными последними n элементами |
| 17 |
def dropWhile(p: (A) => Boolean): Set[A] Отбрасывает элементы слева направо, пока условие p не станет ложным |
| 18 |
def equals(that: Any): Boolean Метод equals можно использовать для любой последовательности. Он используется для сравнения последовательностей на равенство. |
| 19 |
def exists(p: (A) => Boolean): Boolean Определяет, существует ли в неизменяемой коллекции элемент, удовлетворяющий заданному условию. |
| 20 |
def filter(p: (A) => Boolean): Set[A] Выводит все элементы неизменяемой коллекции, удовлетворяющие заданному условию. |
| 21 |
def find(p: (A) => Boolean): Option[A] Находит первый элемент в неизменяемой коллекции, удовлетворяющий заданному условию |
| 22 |
def forall(p: (A) => Boolean): Boolean Проверяет, выполняется ли указанное условие для всех элементов этой коллекции |
| 23 |
def foreach(f: (A) => Unit): Unit Применяет функцию ко всем элементам неизменяемой коллекции |
| 24 |
def head: A Получает первый элемент неизменяемой коллекции |
| 25 |
def init: Set[A] Возвращает все элементы, кроме последнего |
| 26 |
def intersect(that: Set[A]): Set[A] Вычисляет пересечение двух множеств |
| 27 |
def isEmpty: Boolean Определяет, является ли коллекция пустой |
| 28 |
def iterator: Iterator[A] Создаёт новый итератор для перебора элементов |
| 29 |
def last: A Возвращает последний элемент |
| 30 |
def map[B](f: (A) => B): immutable.Set[B] Пересчитывает все элементы с использованием заданного метода |
| 31 |
def max: A Находит наибольший элемент |
| 32 |
def min: A Находит наименьший элемент |
| 33 |
def mkString: String Отображает все элементы коллекции в виде строки |
| 34 |
def mkString(sep: String): String Отображает все элементы коллекции в виде строки с использованием разделителя |
| 35 |
def product: A Возвращает произведение числовых элементов в неизменяемой коллекции. |
| 36 |
def size: Int Возвращает количество элементов в неизменяемой коллекции |
| 37 |
def splitAt(n: Int): (Set[A], Set[A]) Разделяет неизменяемую коллекцию на два контейнера: первый состоит из первых n элементов, а второй — из остальных элементов |
| 38 |
def subsetOf(that: Set[A]): Boolean Возвращает true, если множество содержит подмножество, иначе возвращает false |
| 39 |
def sum: A Возвращает сумму всех числовых элементов в неизменяемой коллекции |
| 40 |
def tail: Set[A] Возвращает элементы неизменяемой коллекции, кроме первого элемента |
| 41 |
def take(n: Int): Set[A] Возвращает первые n элементов |
| 42 |
def takeRight(n: Int):Set[A] Возвращает последние n элементов |
| 43 |
def toArray: Array[A] Преобразует коллекцию в массив |
| 44 |
def toBuffer[B >: A]: Buffer[B] Возвращает буфер, содержащий все элементы неизменяемой коллекции |
| 45 |
def toList: List[A] Возвращает List, содержащий все элементы неизменяемой коллекции |
| 46 |
def toMap[T, U]: Map[T, U] Возвращает Map, содержащий все элементы неизменяемой коллекции |
| 47 |
def toSeq: Seq[A] Возвращает Seq, содержащий все элементы неизменяемой коллекции |
| 48 |
def toString(): String Возвращает строковое представление объекта |
Для других методов, пожалуйста, обратитесь кдокументации API
Другие расширения
Коллекции в Scala