Scala基础教程(六):字符串、数组、集合
創(chuàng)建字符串:
最直接的方法來(lái)創(chuàng)建一個(gè)字符串的編寫方法是:
var greeting = "Hello world!"; ? or ? var greeting:String = "Hello world!";每當(dāng)遇到一個(gè)字符串在代碼中,編譯器創(chuàng)建String對(duì)象及其值,在這個(gè)示例中使用:“Hello world!”,但如果你喜歡,可以給字符串,因?yàn)檫@里我已經(jīng)在聲明中交替顯示。
object Test { ?? val greeting: String = "Hello, world!" ? ?? def main(args: Array[String]) { ????? println( greeting ) ?? } }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test Hello, world! ? C:/>正如前面提到的,String類是不可變的,所以一旦它被創(chuàng)建,String對(duì)象不能改變。如果需要做大量修改字符的字符串,那么應(yīng)該使用在Scala提供字符串構(gòu)建器類(?StringBuilder?)。
字符串長(zhǎng)度:
用于獲得關(guān)于對(duì)象的信息的方法是已知的存取方法。可以使用字符串使用一個(gè)存取方法是length()方法,它返回包含在字符串對(duì)象中的字符數(shù)。
下面兩行代碼被執(zhí)行之后,len 等于17:
object Test { ?? def main(args: Array[String]) { ????? var palindrome = "Dot saw I was Tod"; ????? var len = palindrome.length(); ????? println( "String Length is : " + len ); ?? } }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test String Length is : 17 ? C:/>連接字符串:
String類包括用于連接兩個(gè)字符串的方法:
string1.concat(string2);這返回一個(gè)string1將string2添加到它的末尾的一個(gè)新字符串。也可以使用concat()方法用字符串,如:
"My name is ".concat("Zara");字符串比較常用連接在一起,使用+運(yùn)算符,如:
"Hello," + " world" + "!"這將產(chǎn)生:
"Hello, world!"讓我們來(lái)看看下面的例子:
object Test { ?? def main(args: Array[String]) { ????? var str1 = "Dot saw I was "; ????? var str2 =? "Tod"; ????? println("Dot " + str1 + str2); ?? } }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test Dot Dot saw I was Tod ? C:/>創(chuàng)建格式化字符串:
已經(jīng)有兩個(gè)方法:printf()和format()方法使用格式化數(shù)字打印輸出。 String類有一個(gè)等價(jià)類的方法,format(),它返回一個(gè)String對(duì)象,而不是一個(gè)PrintStream對(duì)象。讓我們看看下面的例子,這是使用printf()方法:
object Test { ?? 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) ?? } }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test The value of the float variable is 12.456000, while the value of the integer var iable is 2000, and the string is Hello, Scala!() ? C:/>字符串的方法:
以下是由java.lang.String類中定義,并且可以直接在Scala程序中使用方法列表:
| SN | 方法及描述 |
| 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)? |
| 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 ooffset, int len)? |
| 28 | boolean regionMatches(int toffset, String other, int ooffset, int len) |
| 29 | String replace(char oldChar, char 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(primitive data type x)? |
?
?
Scala中提供了一種數(shù)據(jù)結(jié)構(gòu)-數(shù)組,其中存儲(chǔ)相同類型的元素的固定大小的連續(xù)集合。數(shù)組用于存儲(chǔ)數(shù)據(jù)的集合,但它往往是更加有用認(rèn)為數(shù)組作為相同類型的變量的集合。
取替聲明單個(gè)變量,如number0, number1, ..., 和number99,聲明一個(gè)數(shù)組變量,如號(hào)碼和使用numbers[0],numbers[1],...,numbers[99]表示單個(gè)變量。本教程 介紹了如何聲明數(shù)組變量,創(chuàng)建數(shù)組和使用索引的過(guò)程變量數(shù)組。數(shù)組的第一個(gè)元素的索引是數(shù)字0和最后一個(gè)元素的索引為元素的總數(shù)減去1。
聲明數(shù)組變量:
要使用的程序的數(shù)組,必須聲明一個(gè)變量來(lái)引用數(shù)組,必須指定數(shù)組變量可以引用的類型。下面是語(yǔ)法聲明數(shù)組變量:
var z:Array[String] = new Array[String](3) ? or ? var z = new Array[String](3)在這里,z被聲明為字符串?dāng)?shù)組,最多可容納三個(gè)元素??梢詫⒅捣峙浣o獨(dú)立的元素或可以訪問(wèn)單個(gè)元素,這是可以做到通過(guò)使用類似于以下命令:
z(0) = "Zara"; z(1) = "Nuha"; z(4/2) = "Ayan"在這里,最后一個(gè)例子表明,在一般的索引可以是產(chǎn)生一個(gè)全數(shù)字的表達(dá)式。定義數(shù)組還有另一種方式:
var z = Array("Zara", "Nuha", "Ayan")下圖展示了數(shù)組myList。在這里,myList中擁有10個(gè)double值,索引是從0到9。
處理數(shù)組:
當(dāng)要處理數(shù)組元素,我們經(jīng)常使用循環(huán),因?yàn)樗械臄?shù)組中的元素具有相同的類型,并且數(shù)組的大小是已知的。這里是展示如何創(chuàng)建,初始化和處理數(shù)組的完整的例子:
object Test { ?? def main(args: Array[String]) { ????? var myList = Array(1.9, 2.9, 3.4, 3.5) ????? ??????// Print all the array elements ????? for ( x <- myList ) { ???????? println( x ) ????? } ? ????? // Summing all elements ????? var total = 0.0; ????? for ( i <- 0 to (myList.length - 1)) { ???????? total += myList(i); ????? } ????? println("Total is " + total); ? ????? // Finding the largest element ????? var max = myList(0); ????? for ( i <- 1 to (myList.length - 1) ) { ???????? if (myList(i) > max) max = myList(i); ????? } ????? println("Max is " + max); ??? ???} }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test 1.9 2.9 3.4 3.5 Total is 11.7 Max is 3.5 ? C:/>多維數(shù)組:
有很多情況下,需要定義和使用多維數(shù)組(即數(shù)組的元素?cái)?shù)組)。例如,矩陣和表格結(jié)構(gòu)的實(shí)例可以實(shí)現(xiàn)為二維數(shù)組。
Scala不直接支持多維數(shù)組,并提供各種方法來(lái)處理任何尺寸數(shù)組。以下是定義的二維數(shù)組的實(shí)例:
var myMatrix = ofDim[Int](3,3)這是一個(gè)具有每個(gè)都是整數(shù),它有三個(gè)元素?cái)?shù)組3元素的數(shù)組。下面的代碼展示了如何處理多維數(shù)組:
import Array._ ? object Test { ?? def main(args: Array[String]) { ????? var myMatrix = ofDim[Int](3,3) ????? ??????// build a matrix ????? for (i <- 0 to 2) { ???????? for ( j <- 0 to 2) { ??????????? myMatrix(i)(j) = j; ???????? } ????? } ????? ??????// Print two dimensional array ????? for (i <- 0 to 2) { ???????? for ( j <- 0 to 2) { ??????????? print(" " + myMatrix(i)(j)); ???????? } ???????? println(); ????? } ??? ???} }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test 0 1 2 0 1 2 0 1 2 ? C:/>聯(lián)接數(shù)組:
以下是使用concat()方法來(lái)連接兩個(gè)數(shù)組的例子。可以通過(guò)多個(gè)陣列作為參數(shù)傳遞給concat()方法。
import Array._ ? object Test { ?? def main(args: Array[String]) { ????? var myList1 = Array(1.9, 2.9, 3.4, 3.5) ????? var myList2 = Array(8.9, 7.9, 0.4, 1.5) ? ????? var myList3 =? concat( myList1, myList2) ????? ??????// Print all the array elements ????? for ( x <- myList3 ) { ???????? println( x ) ????? } ?? } }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test 1.9 2.9 3.4 3.5 8.9 7.9 0.4 1.5 ? C:/>創(chuàng)建具有范圍數(shù)組:
下面是示例,這使得使用range() 方法來(lái)產(chǎn)生包含在給定的范圍內(nèi)增加整數(shù)序列的數(shù)組??梢允褂米詈笠粋€(gè)參數(shù)創(chuàng)建序列; 如果不使用最后一個(gè)參數(shù),然后一步將被假定為1。
import Array._ ? object Test { ?? def main(args: Array[String]) { ????? var myList1 = range(10, 20, 2) ????? var myList2 = range(10,20) ? ????? // Print all the array elements ????? for ( x <- myList1 ) { ???????? print( " " + x ) ????? } ????? println() ????? for ( x <- myList2 ) { ???????? print( " " + x ) ????? } ?? } }讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test 10 12 14 16 18 10 11 12 13 14 15 16 17 18 19 ? C:/>Scala中數(shù)組方法:
以下是重要的方法,可以同時(shí)使用數(shù)組。如上所示,則必須使用任何提及的方法之前,要導(dǎo)入Array._包。有關(guān)可用方法的完整列表,請(qǐng)Scala中的官方文件。
| SN | 方法及描述 |
| 1 | def apply( x: T, xs: T* ): Array[T] |
| 2 | def concat[T]( xss: Array[T]* ): Array[T] |
| 3 | def copy( src: AnyRef, srcPos: Int, dest: AnyRef, destPos: Int, length: Int ): Unit |
| 4 | def empty[T]: Array[T] |
| 5 | def iterate[T]( start: T, len: Int )( f: (T) => T ): Array[T] |
| 6 | def fill[T]( n: Int )(elem: => T): Array[T] |
| 7 | def fill[T]( n1: Int, n2: Int )( elem: => T ): Array[Array[T]] |
| 8 | def iterate[T]( start: T, len: Int)( f: (T) => T ): Array[T] |
| 9 | def ofDim[T]( n1: Int ): Array[T] |
| 10 | def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]] |
| 11 | def ofDim[T]( n1: Int, n2: Int, n3: Int ): Array[Array[Array[T]]] |
| 12 | def range( start: Int, end: Int, step: Int ): Array[Int] |
| 13 | def range( start: Int, end: Int ): Array[Int] |
| 14 | def tabulate[T]( n: Int )(f: (Int)=> T): Array[T] |
| 15 | def tabulate[T]( n1: Int, n2: Int )( f: (Int, Int ) => T): Array[Array[T]] |
?
?
Scala有一組豐富的集合庫(kù)。集合是對(duì)事物的容器。這些容器可被測(cè)序,線性集像List, Tuple, Option, Map等集合的項(xiàng)目可具有元素的任意數(shù)量或有界到零個(gè)或一個(gè)元素(例如,Option)。
集合可能是嚴(yán)格或懶惰。懶集合有可能不消耗內(nèi)存,直到他們被訪問(wèn),就像范圍元素。此外,集合可以是可變的(引用的內(nèi)容可以更改)或不變(一個(gè)引用的東西指從未改變)。需要注意的是不可變的集合可能包含可變項(xiàng)。
對(duì)于一些問(wèn)題,可變集合更好地工作,并為不可變集合更好地工作。如果有疑問(wèn),最好是先從一個(gè)不變的集合,如果需要可變進(jìn)行更改。
本章給出最常用的集合類型對(duì)這些集合的信息和使用最頻繁的操作。
| SN | 集合使用說(shuō)明 |
| 1 | Scala Lists |
| 2 | Scala Sets |
| 3 | Scala Maps |
| 4 | Scala Tuples |
| 5 | Scala Options |
| 6 | Scala Iterators |
示例:
下面的代碼片段是一個(gè)簡(jiǎn)單的例子來(lái)定義所有上述集合類型:
// Define List of integers. val x = List(1,2,3,4) ? // Define a set. var x = Set(1,3,5,7) ? // Define a map. val x = Map("one" -> 1, "two" -> 2, "three" -> 3) ? // Create a tuple of two elements. val x = (10, "Scala") ? // Define an option val x:Option[Int] = Some(5)?
?
類是一個(gè)對(duì)象的藍(lán)圖。一旦定義一個(gè)類可以創(chuàng)建從類藍(lán)圖使用關(guān)鍵字new創(chuàng)建對(duì)象。下面是一個(gè)簡(jiǎn)單的語(yǔ)法在Scala中定義一個(gè)類:
class Yiibai(xc: Int, yc: Int) { ?? var x: Int = xc ?? var y: Int = yc ? ?? def move(dx: Int, dy: Int) { ????? x = x + dx ????? y = y + dy ????? println ("Yiibai x location : " + x); ????? println ("Yiibai y location : " + y); ?? } }這個(gè)類定義了兩個(gè)變量x和y和方法:move,沒有返回值。類變量被調(diào)用,類的字段和方法被稱為類方法。
類名可以作為一個(gè)類的構(gòu)造函數(shù),可以采取一些參數(shù)。上面的代碼定義了兩個(gè)構(gòu)造函數(shù)的參數(shù):xc和yc;它們都在類的主體內(nèi)可見。
正如前面提到的,可以使用關(guān)鍵字new創(chuàng)建對(duì)象,然后可以按照下面的例子所示訪問(wèn)類的字段和方法:
import java.io._ ? class Yiibai(val xc: Int, val yc: Int) { ?? var x: Int = xc ?? var y: Int = yc ?? def move(dx: Int, dy: Int) { ????? x = x + dx ????? y = y + dy ????? println ("Yiibai x location : " + x); ????? println ("Yiibai y location : " + y); ?? } } ? object Test { ?? def main(args: Array[String]) { ????? val pt = new Yiibai(10, 20); ? ????? // Move to a new location ????? pt.move(10, 10); ?? } }當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:
C:/>scalac Test.scala C:/>scala Test Yiibai x location : 20 Yiibai y location : 30 ? C:/>from: http://www.yiibai.com/scala/scala_basic_syntax.html總結(jié)
以上是生活随笔為你收集整理的Scala基础教程(六):字符串、数组、集合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Scala基础教程(五):函数、闭包
- 下一篇: Scala基础教程(七):类和对象、特征