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(site)1, 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]

def takeWhile(p: (A) => Boolean): List[A]

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 집합