Scala - 字串



本章將帶您瞭解 Scala 字串。在 Scala 中,與 Java 一樣,字串是不可變物件,即無法修改的物件。另一方面,可以修改的物件(如陣列)稱為可變物件。字串是非常有用的物件,在本節的其餘部分,我們將介紹java.lang.String類的重要方法。

建立字串

可以使用以下程式碼建立字串:

var greeting = "Hello world!";

or

var greeting:String = "Hello world!";

每當編譯器在程式碼中遇到字串文字時,它都會建立一個 String 物件,其值為“Hello world!”。如上所示,也可以使用 String 關鍵字進行備用宣告。

嘗試以下示例程式。

示例

object Demo {
   val greeting: String = "Hello, world!"

   def main(args: Array[String]) {
      println( greeting )
   }
}

將上述程式儲存為Demo.scala。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Hello, world!

如前所述,String 類是不可變的。建立 String 物件後,不能更改。如果需要對字元的字串進行大量修改,請使用 Scala 中提供的 String Builder 類!。

字串長度

用於獲取有關物件資訊的方法稱為訪問器方法。可以與字串一起使用的一種訪問器方法是 length() 方法,它返回字串物件中包含的字元數。

使用以下程式碼段查詢字串的長度:

示例

object Demo {
   def main(args: Array[String]) {
      var palindrome = "Dot saw I was Tod";
      var len = palindrome.length();
      
      println( "String Length is : " + len );
   }
}

將上述程式儲存為Demo.scala。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

String Length is : 17

連線字串

String 類包含一個用於連線兩個字串的方法:

string1.concat(string2);

這將返回一個新字串,該字串是 string1,並在其末尾添加了 string2。您也可以將 concat() 方法與字串文字一起使用,如下所示:

"My name is ".concat("Zara");

字串通常使用 + 運算子連線,如下所示:

"Hello," + " world" + "!"

結果為:

"Hello, world!"

以下程式碼行用於查詢字串長度。

示例

object Demo {
   def main(args: Array[String]) {
      var str1 = "Dot saw I was ";
      var str2 =  "Tod";
      
      println("Dot " + str1 + str2);
   }
}

將上述程式儲存為Demo.scala。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Dot Dot saw I was Tod

建立格式化字串

您可以使用 printf() 和 format() 方法以格式化的數字列印輸出。String 類有一個等效的類方法 format(),它返回 String 物件而不是 PrintStream 物件。

嘗試以下示例程式,該程式使用了 printf() 方法:

示例

object Demo {
   def main(args: Array[String]) {
      var floatVar = 12.456
      var intVar = 2000
      var stringVar = "Hello, Scala!"
      
      var fs = printf("The value of the float variable is " + "%f, while the value of the integer " + "variable is %d, and the string" + "is %s", floatVar, intVar, stringVar);
      
      println(fs)
   }
}

將上述程式儲存為Demo.scala。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

The value of the float variable is 12.456000, 
while the value of the integer variable is 2000, 
and the string is Hello, Scala!()

字串插值

字串插值是在 Scala 程式語言中建立字串的新方法。此功能支援 Scala-2.10 及更高版本。字串插值:將變數引用直接嵌入到處理字串文字中的機制。

字串插值中有三種類型的實現(插值器)。

“s”字串插值器

文字“s”允許在處理字串時直接使用變數,當您在前面加上“s”時。任何在作用域內的字串變數都可以與字串一起使用。以下是“s”字串插值器的不同用法。

以下示例程式碼段演示了在 println 語句中將“s”插值器用於將字串變數($name)追加到普通字串(Hello)的實現。

val name = “James”
println(s “Hello, $name”) //output: Hello, James

字串插值器還可以處理任意表達式。以下程式碼段使用“s”字串插值器處理帶有任意表達式(${1 + 1})的字串(1 + 1)。任何任意表達式都可以嵌入到“${}”中。

println(s “1 + 1 = ${1 + 1}”) //output: 1 + 1 = 2

嘗試以下實現“s”插值器的示例程式。

示例

object Demo {
   def main(args: Array[String]) {
      val name = "James"
      
      println(s"Hello, $name")
      println(s"1 + 1 = ${1 + 1}")
   }
}

將上述程式儲存為Demo.scala。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Hello, James
1 + 1 = 2

“f”插值器

文字“f”插值器允許建立格式化字串,類似於 C 語言中的 printf。使用“f”插值器時,所有變數引用後面都應跟有printf樣式的格式說明符,例如 %d、%i、%f 等。

讓我們舉一個將浮點值(height = 1.9d)和字串變數(name = “James”)與普通字串追加的例子。以下程式碼段演示了“f”插值器的實現。這裡 $name%s 用於列印(字串變數)James,$height%2.2f 用於列印(浮點值)1.90。

val height = 1.9d
val name = "James"
println(f"$name%s is $height%2.2f meters tall") //James is 1.90 meters tall

它是型別安全的(即)變數引用和後面的格式說明符應該匹配,否則會顯示錯誤。“f”插值器使用了 Java 中可用的 String 格式實用程式(格式說明符)。預設情況下,變數引用後沒有 % 字元。它將假定為 %s(字串)。

“raw”插值器

“raw”插值器類似於“s”插值器,除了它不對字串中的文字執行任何轉義。下表中的以下程式碼段將“s”和“raw”插值器的用法區分開來。“s”用法的輸出中“\n”的作用是換行,而“raw”用法的輸出中“\n”不會起作用。它將列印包含跳脫字元的完整字串。

“s”插值器用法 “raw”插值器用法

程式 -

object Demo {
   def main(args: Array[String]) {
      println(s"Result = \n a \n b")
   }
}

程式 -

object Demo {
   def main(args: Array[String]) {
      println(raw"Result = \n a \n b")
   }
}

輸出 -

Result =
a
b

輸出 -

Result = \n a \n b

字串方法

以下是java.lang.String類定義的方法列表,可以在您的 Scala 程式中直接使用:

序號 帶描述的方法
1

char charAt(int index)

返回指定索引處的字元。

2

int compareTo(Object o)

將此字串與另一個物件進行比較。

3

int compareTo(String anotherString)

按字典順序比較兩個字串。

4

int compareToIgnoreCase(String str)

按字典順序比較兩個字串,忽略大小寫差異。

5

String concat(String str)

將指定的字串連線到此字串的末尾。

6

boolean contentEquals(StringBuffer sb)

當且僅當此字串表示與指定 StringBuffer 相同的字元序列時,返回 true。

7

static String copyValueOf(char[] data)

返回一個表示指定陣列中字元序列的字串。

8

static String copyValueOf(char[] data, int offset, int count)

返回一個表示指定陣列中字元序列的字串。

9

boolean endsWith(String suffix)

測試此字串是否以指定的結尾結尾。

10

boolean equals(Object anObject)

將此字串與指定物件進行比較。

11

boolean equalsIgnoreCase(String anotherString)

將此字串與另一個字串進行比較,忽略大小寫考慮因素。

12

byte getBytes()

使用平臺的預設字元集將此字串編碼為位元組序列,並將結果儲存到新的位元組陣列中。

13

byte[] getBytes(String charsetName)

使用指定的字元集將此字串編碼為位元組序列,並將結果儲存到新的位元組陣列中。

14

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

將此字串中的字元複製到目標字元陣列中。

15

int hashCode()

返回此字串的雜湊碼。

16

int indexOf(int ch)

返回此字串中指定字元第一次出現的索引。

17

int indexOf(int ch, int fromIndex)

返回此字串中指定字元第一次出現的索引,從指定的索引開始搜尋。

18

int indexOf(String str)

返回此字串中指定子字串第一次出現的索引。

19

int indexOf(String str, int fromIndex)

返回此字串中指定子字串第一次出現的索引,從指定的索引開始。

20

String intern()

返回字串物件的規範表示形式。

21

int lastIndexOf(int ch)

返回此字串中指定字元最後一次出現的索引。

22

int lastIndexOf(int ch, int fromIndex)

返回此字串中指定字元最後一次出現的索引,從指定的索引開始向後搜尋。

23

int lastIndexOf(String str)

返回此字串中指定子字串最右邊出現的索引。

24

int lastIndexOf(String str, int fromIndex)

返回此字串中指定子字串最後一次出現的索引,從指定的索引開始向後搜尋。

25

int length()

返回此字串的長度。

26

boolean matches(String regex)

判斷此字串是否與給定的正則表示式匹配。

27

boolean regionMatches(boolean ignoreCase, int toffset, String other, int offset, int len)

測試兩個字串區域是否相等。

28

boolean regionMatches(int toffset, String other, int offset, int len)

測試兩個字串區域是否相等。

29

String replace(char oldChar, char newChar)

返回一個新字串,該字串是透過將此字串中所有出現的 oldChar 替換為 newChar 生成的。

30

String replaceAll(String regex, String replacement

將此字串中與給定正則表示式匹配的每個子字串替換為給定的替換。

31

String replaceFirst(String regex, String replacement)

將此字串中第一個與給定正則表示式匹配的子字串替換為給定的替換。

32

String[] split(String regex)

根據給定正則表示式的匹配拆分此字串。

33

String[] split(String regex, int limit)

根據給定正則表示式的匹配拆分此字串。

34

boolean startsWith(String prefix)

測試此字串是否以指定的字首開頭。

35

boolean startsWith(String prefix, int toffset)

測試此字串是否以指定索引開始的指定字首開頭。

36

CharSequence subSequence(int beginIndex, int endIndex)

返回一個新的字元序列,它是此序列的子序列。

37

String substring(int beginIndex)

返回一個新的字串,它是此字串的子字串。

38

String substring(int beginIndex, int endIndex)

返回一個新的字串,它是此字串的子字串。

39

char[] toCharArray()

將此字串轉換為一個新的字元陣列。

40

String toLowerCase()

使用預設區域設定的規則將此字串中的所有字元轉換為小寫。

41

String toLowerCase(Locale locale)

使用給定區域設定的規則將此字串中的所有字元轉換為小寫。

42

String toString()

此物件(它本身就是一個字串!)將被自身返回。

43

String toUpperCase()

使用預設區域設定的規則將此字串中的所有字元轉換為大寫。

44

String toUpperCase(Locale locale)

使用給定區域設定的規則將此字串中的所有字元轉換為大寫。

45

String trim()

返回字串的副本,省略開頭和結尾的空格。

46

static String valueOf(原始資料型別 x)

返回傳遞的資料型別引數的字串表示形式。

廣告