Scala Strings字符串
本章介绍Scala的字符串。在Scala中,字符串与Java一样,是不可修改的对象,也就是说,它是不可变的对象。另一方面,可以被修改的对象,如数组,被称为可变对象。字符串是非常有用的对象,在本节的其余部分中,我们介绍 java.lang.String 类的重要方法。
创建字符串
下面的代码可用于创建一个字符串 –
var greeting = "Hello world!";
or
var greeting:String = "Hello world!";
每当编译器在代码中遇到一个字符串字面量时,它会创建一个其值为“Hello world!”的String对象。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);
这返回一个新的字符串,它是将string2添加到string1末尾的结果。您还可以使用字符串字面值和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’字符串插值器的不同用法。
下面是一个使用‘s’插值器在println语句中将字符串变量($name)附加到普通字符串(Hello)的示例代码片段。
val name = “James”
println(s “Hello, $name”) //output: Hello, James
字符串内插器也可以处理任意表达式。以下代码段用于处理包含任意表达式(1 + 1)的字符串(${1 + 1}),使用了s
字符串内插器。任何任意表达式都可以嵌入在${}
中。
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 isheight%2.2f meters tall") //James is 1.90 meters tall
它是类型安全的(即)变量引用和后续的格式说明符应该匹配,否则会显示错误。‘f’内插器使用了Java中可用的String格式工具(格式说明符)。默认情况下,变量引用后面没有%字符。它会假设为%s(字符串)。
‘raw’内插器
‘raw’内插器类似于‘s’内插器,但它不对字符串中的文字进行任何转义。下面的代码片段表格将展示‘s’和‘raw’内插器的使用区别。在使用‘s’时,‘\n’会作为换行符出现在输出中,在使用‘raw’时,‘\n’不起作用,它会打印包含转义字符的完整字符串。
‘s’ interpolator usage Program −
object Demo {
def main(args: Array[String]) {
println(s"Result = \n a \n b")
}
}
输出 −
Result =
a
b
‘raw’ interpolator usage Program −
object Demo {
def main(args: Array[String]) {
println(raw"Result = \n a \n b")
}
}
输出 −
Result = \n a \n b
字符串方法
以下是由 java.lang.String 类定义的方法列表,可以直接在您的Scala程序中使用 –
Sr.No | 方法及描述 |
---|---|
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[] split(String regex, int limit) Splits this string around matches of the given regular expression with the specified limit. |
34 | boolean startsWith(String prefix) Tests if this string starts with the specified prefix. |
35 | boolean startsWith(String prefix, int toffset) Tests if this string starts with the specified prefix beginning at the specified index. |
36 | CharSequence subSequence(int beginIndex, int endIndex) Returns a CharSequence that is a subsequence of this sequence. |
37 | String substring(int beginIndex) Returns a new string that is a substring of this string. |
38 | String substring(int beginIndex, int endIndex) Returns a new string that is a substring of this string. |
39 | char[] toCharArray() Converts this string to a new character array. |
40 | String toLowerCase() Converts all of the characters in this String to lower case using the rules of the default locale. |
41 | String toLowerCase(Locale locale) Converts all of the characters in this String to lower case using the rules of the given Locale. |
42 | String toString() This object (which is already a string!) is itself returned. |
43 | 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(primitive data type x) 返回传递的数据类型参数的字符串表示形式。 |