Scala字串


本章將介紹Scala中的字串。 在Scala中的字串和Java中的一樣,字串是一個不可變的物件,也就是一個不能修改的物件。可以修改的物件,如陣列,稱為可變物件。字串是非常有用的物件,在本節的最後部分,我們將介紹java.lang.String類的一些重要方法。

1.建立一個字串

以下是建立一個字串的程式碼 -

var greeting = "Hello world!";

// 或者

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中,使用以下命令編譯和執行此程式。

D:\> scalac Demo.scala
D:\> scala Demo

Hello, world!

如前所述,String類是不可變的。建立後的String物件是無法更改的。如果有必要對字串進行大量修改,那麼可考慮使用Scala中提供的StringBuilder類。

2. 字串長度

用於獲取有關物件的資訊的方法稱為存取器方法。一個可以與字串一起使用的存取器方法是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

3. 連線字串

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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo

Dot Dot saw I was Tod

4. 建立格式化字串

您可以使用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中,以下命令用於編譯和執行此程式。

D:\>scalac Demo.scala
D:\>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!()

5. 字串插值

字串插值是使用Scala程式設計語言建立字串的新方法。此功能支援只在Scala-2.10及更高版本。字串插值:直接在過程字串文字中嵌入變數參照的機制。

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

5.1. ‘s’字串插值器

文字's'允許在處理字串時直接使用變數。任何在範圍中的String變數可以在字串中使用。以下是's'字串插值器的不同用法。

println語句中將String變數($name)附加到普通字串(Hello)中,以下範例程式碼片段用於實現's'插值器。

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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo

Hello, James
1 + 1 = 2

5.2 ‘f’插值器

文字'f'插值器允許建立一個格式化的字串,類似於C語言中的printf。 在使用'f'插值器時,所有變數參照都應該是printf樣式格式說明符,如%d%i%f等。

我們以一般的字串為例附加浮點值(height = 1.9d)和字串變數(name =「James」)。下面的程式碼片段實現'f'插值器。這裡$name%s列印String變數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的字串。

5.3 「原始」插值器

'raw'內插器類似於's'插值器,除了它不執行字串內的文字跳脫。下表中的程式碼段將區別's''raw'插值器的用法。 在使用s\n效果的輸出中,新行作為原始值輸出,也就是\n將不起作用。它將使用跳脫字母列印完整的字串。

  • 's'的插值器使用,程式程式碼如下 -

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

    輸出結果 -

    Result =
    a
    b
    
  • 'raw'的插值器使用,程式程式碼如下 -

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

    輸出結果 -

    Result = \n a \n b
    

字串方法

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

編號 方法 描述
1 char charAt(int index) 返回指定索引處的字元。
2 int compareTo(Object o) 將此String與另一個物件進行比較。
3 int compareTo(String anotherString) 按字典順序比較兩個字串。
4 int compareToIgnoreCase(String str) 按字典順序比較兩個字串,忽略大小寫差異。
5 String concat(String str) 將指定的字串連線到該字串的末尾。
6 boolean contentEquals(StringBuffer sb) 當且僅當此String表示與指定的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) 將此String與另一個String進行比較,並忽略大小寫。
12 byte getBytes() 使用平台的預設字元集將此String編碼為一系列位元組,將結果儲存到新的位元組陣列中。
13 byte[] getBytes(String charsetName) 使用命名的字元集將此String編碼為一系列位元組,將結果儲存到新的位元組陣列中。
14 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 將此字串從srcBeginsrcEnd索引處的字元複製到目標字元陣列(dst)中。
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) 返回一個新的字串,此字串是使用newChar替換此字串中所有出現的oldChar的結果。
30 String replaceAll(String regex, String replacement 使用replacement替換與給定正規表示式(regex)匹配的字串中的每個子字串。
31 String replaceFirst(String regex, String replacement) 用給定的replacement替換與給定正規表示式(regex)匹配的字串中的第一個子字串。
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() 使用預設語言環境的規則將此String中的所有字元轉換為小寫。
41 String toLowerCase(Locale locale) 使用給定的區域設定的規則將此String中的所有字元轉換為小寫。
42 String toString() 此物件(已經是字串)本身已被返回。
43 String toUpperCase() 使用預設語言環境的規則將此字串中的所有字元轉換為大寫。
44 String toUpperCase(Locale locale) 使用給定的區域設定的規則將此String中的所有字元轉換為大寫。
45 String trim() 返回字串的副本,省略前導和尾隨空格。
46 static String valueOf(primitive data type x) 返回傳遞資料型別引數的字串表示形式。