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) 返回傳遞數據類型參數的字串表示形式。

上一篇: Scala閉包 下一篇: Scala數組