Scala基础教程(六):字符串、数组、集合
創建字符串:
最直接的方法來創建一個字符串的編寫方法是:
var greeting = "Hello world!"; ? or ? var greeting:String = "Hello world!";每當遇到一個字符串在代碼中,編譯器創建String對象及其值,在這個示例中使用:“Hello world!”,但如果你喜歡,可以給字符串,因為這里我已經在聲明中交替顯示。
object Test { ?? val greeting: String = "Hello, world!" ? ?? def main(args: Array[String]) { ????? println( greeting ) ?? } }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test Hello, world! ? C:/>正如前面提到的,String類是不可變的,所以一旦它被創建,String對象不能改變。如果需要做大量修改字符的字符串,那么應該使用在Scala提供字符串構建器類(?StringBuilder?)。
字符串長度:
用于獲得關于對象的信息的方法是已知的存取方法。可以使用字符串使用一個存取方法是length()方法,它返回包含在字符串對象中的字符數。
下面兩行代碼被執行之后,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 ); ?? } }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test String Length is : 17 ? C:/>連接字符串:
String類包括用于連接兩個字符串的方法:
string1.concat(string2);這返回一個string1將string2添加到它的末尾的一個新字符串。也可以使用concat()方法用字符串,如:
"My name is ".concat("Zara");字符串比較常用連接在一起,使用+運算符,如:
"Hello," + " world" + "!"這將產生:
"Hello, world!"讓我們來看看下面的例子:
object Test { ?? def main(args: Array[String]) { ????? var str1 = "Dot saw I was "; ????? var str2 =? "Tod"; ????? println("Dot " + str1 + str2); ?? } }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test Dot Dot saw I was Tod ? C:/>創建格式化字符串:
已經有兩個方法:printf()和format()方法使用格式化數字打印輸出。 String類有一個等價類的方法,format(),它返回一個String對象,而不是一個PrintStream對象。讓我們看看下面的例子,這是使用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) ?? } }讓我們編譯和運行上面的程序,這將產生以下結果:
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中提供了一種數據結構-數組,其中存儲相同類型的元素的固定大小的連續集合。數組用于存儲數據的集合,但它往往是更加有用認為數組作為相同類型的變量的集合。
取替聲明單個變量,如number0, number1, ..., 和number99,聲明一個數組變量,如號碼和使用numbers[0],numbers[1],...,numbers[99]表示單個變量。本教程 介紹了如何聲明數組變量,創建數組和使用索引的過程變量數組。數組的第一個元素的索引是數字0和最后一個元素的索引為元素的總數減去1。
聲明數組變量:
要使用的程序的數組,必須聲明一個變量來引用數組,必須指定數組變量可以引用的類型。下面是語法聲明數組變量:
var z:Array[String] = new Array[String](3) ? or ? var z = new Array[String](3)在這里,z被聲明為字符串數組,最多可容納三個元素。可以將值分配給獨立的元素或可以訪問單個元素,這是可以做到通過使用類似于以下命令:
z(0) = "Zara"; z(1) = "Nuha"; z(4/2) = "Ayan"在這里,最后一個例子表明,在一般的索引可以是產生一個全數字的表達式。定義數組還有另一種方式:
var z = Array("Zara", "Nuha", "Ayan")下圖展示了數組myList。在這里,myList中擁有10個double值,索引是從0到9。
處理數組:
當要處理數組元素,我們經常使用循環,因為所有的數組中的元素具有相同的類型,并且數組的大小是已知的。這里是展示如何創建,初始化和處理數組的完整的例子:
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); ??? ???} }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test 1.9 2.9 3.4 3.5 Total is 11.7 Max is 3.5 ? C:/>多維數組:
有很多情況下,需要定義和使用多維數組(即數組的元素數組)。例如,矩陣和表格結構的實例可以實現為二維數組。
Scala不直接支持多維數組,并提供各種方法來處理任何尺寸數組。以下是定義的二維數組的實例:
var myMatrix = ofDim[Int](3,3)這是一個具有每個都是整數,它有三個元素數組3元素的數組。下面的代碼展示了如何處理多維數組:
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(); ????? } ??? ???} }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test 0 1 2 0 1 2 0 1 2 ? C:/>聯接數組:
以下是使用concat()方法來連接兩個數組的例子。可以通過多個陣列作為參數傳遞給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 ) ????? } ?? } }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test 1.9 2.9 3.4 3.5 8.9 7.9 0.4 1.5 ? C:/>創建具有范圍數組:
下面是示例,這使得使用range() 方法來產生包含在給定的范圍內增加整數序列的數組。可以使用最后一個參數創建序列; 如果不使用最后一個參數,然后一步將被假定為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 ) ????? } ?? } }讓我們編譯和運行上面的程序,這將產生以下結果:
C:/>scalac Test.scala C:/>scala Test 10 12 14 16 18 10 11 12 13 14 15 16 17 18 19 ? C:/>Scala中數組方法:
以下是重要的方法,可以同時使用數組。如上所示,則必須使用任何提及的方法之前,要導入Array._包。有關可用方法的完整列表,請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有一組豐富的集合庫。集合是對事物的容器。這些容器可被測序,線性集像List, Tuple, Option, Map等集合的項目可具有元素的任意數量或有界到零個或一個元素(例如,Option)。
集合可能是嚴格或懶惰。懶集合有可能不消耗內存,直到他們被訪問,就像范圍元素。此外,集合可以是可變的(引用的內容可以更改)或不變(一個引用的東西指從未改變)。需要注意的是不可變的集合可能包含可變項。
對于一些問題,可變集合更好地工作,并為不可變集合更好地工作。如果有疑問,最好是先從一個不變的集合,如果需要可變進行更改。
本章給出最常用的集合類型對這些集合的信息和使用最頻繁的操作。
| SN | 集合使用說明 |
| 1 | Scala Lists |
| 2 | Scala Sets |
| 3 | Scala Maps |
| 4 | Scala Tuples |
| 5 | Scala Options |
| 6 | Scala Iterators |
示例:
下面的代碼片段是一個簡單的例子來定義所有上述集合類型:
// 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)?
?
類是一個對象的藍圖。一旦定義一個類可以創建從類藍圖使用關鍵字new創建對象。下面是一個簡單的語法在Scala中定義一個類:
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); ?? } }這個類定義了兩個變量x和y和方法:move,沒有返回值。類變量被調用,類的字段和方法被稱為類方法。
類名可以作為一個類的構造函數,可以采取一些參數。上面的代碼定義了兩個構造函數的參數:xc和yc;它們都在類的主體內可見。
正如前面提到的,可以使用關鍵字new創建對象,然后可以按照下面的例子所示訪問類的字段和方法:
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); ?? } }當上述代碼被編譯和執行時,它產生了以下結果:
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總結
以上是生活随笔為你收集整理的Scala基础教程(六):字符串、数组、集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Scala基础教程(五):函数、闭包
- 下一篇: Scala基础教程(七):类和对象、特征