Scala Set (коллекция)

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

Scala Set — это коллекция объектов без дубликатов; все элементы уникальны.

Коллекции Scala делятся на изменяемые и неизменяемые коллекции.

По умолчанию Scala использует неизменяемые коллекции. Если вы хотите использовать изменяемые коллекции, вам нужно обратиться к пакетуscala.collection.mutable.Set.

По умолчанию используется scala.collection.immutable.Set. Пример неизменяемой коллекции приведён ниже:

Пример

val set = Set(1,2,3)
println(set.getClass.getName) //

println(set.exists(_ % 2 == 0)) //true
println(set.drop(1)) //Set(2,3)

Если вам нужно использовать изменяемые коллекции, необходимо импортировать scala.collection.mutable.Set:

Пример

import 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 может быть выражена с помощью этих трёх основных операций. Пример:

Пример

object Test {
   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.++()метод для конкатенации двух множеств. Если есть повторяющиеся элементы, они будут удалены. Пример:

Пример

object Test {
   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метод, чтобы найти наибольший элемент в множестве. Пример:

Пример

object Test {
   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метод для просмотра элементов пересечения двух множеств. Пример:

Пример

object Test {
   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 集合Коллекции в Scala

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