Bu bölümde Scala Arrays yapılarına kısa bir giriş yapacağız.
1-) Fixed-Length Arrays
Scala’da sabit uzunlukta array tanımlamak için Array tipini kullanırız.
val nums = new Array[ Int ](10)
//10 adet integer tipinde eleman içeren bir array.Tüm elemanların değeri 0
val a = new Array[String](10)
//10 adet String tipinde eleman içeren bir array.Tüm elemanların değeri null
val s = Array("Eleman1","Eleman2")
//2 elemanlı array
s(0) = "ElemanYeni"
s array’nin elemanları Array(“ElemanYeni”,”Eleman2″) olur
Array’in elemanlarına erişmek için Java’daki [] yerine () karakterlerini kullanırız.
Önemli ! : Array tanımlarken elemanları ilk değerle tanımladığımız new operatörünü kullanmamıza gerek yok.
JVM,bir Scala Array tipini Java Array olarak işler.Örneğin, Scala’da bir Array[Int] aslında Java int[] olarak temsil edilir.Aynı zamanda Scala Array, Java’daki Array’den daha fazlasıdır.Mesela, Scala Array generic tanımlanabilir.T tip parametresi veya abstract tip olmak üzere Array[T] şeklinde bir array tanımlayabiliriz Scala’da.
2-) Variable-Length Arrays / Array Buffers
Java’da boyutu değişebilir array tanımlamak için ArrayList kullanırız.Scala’da ise aynı işlevi ArrayBuffer ile sağlarız.
import scala.collection.mutable.ArrayBuffer
val aBuffer = ArrayBuffer[Int]()
//Ya da new ArrayBuffer[Int].Int tipinde eleman almaya hazır boş array buffer
aBuffer += 1
// += ile eleman ekleyebiliyoruz
aBuffer += (1,2,3,5)
// () ile aynı anda birden fazla eleman ekleyebiliyoruz array'e
aBuffer ++= Array(8,13,21)
// ++= operatörü ile herhangi bir collection dizisini array buffer'a ekleyebiliyoruz
aBuffer.trimEnd(5)
//trimEnd fonksiyonu ile son 5 elemanı array buffer'dan çıkarabiliriz
Diyelim ki bir Array tanımlamak istiyoruz ama boyutunu ne olacağını kestiremiyoruz.Bu durumda önce ArrayBuffer oluşturup,elemanları ekleyip daha sonra bu buffer üzerinde toArray fonksiyonun çağırarak Array oluşturabiliriz.
3-) Traversing Arrays and Array Buffers
Scala’da array elemanları içerisinde gezinmek Java’ya nispeten çok daha kolaydır.
for( i<-0 until a.lenght)
until methodu RichInt class’ının bir methodur.
0 until 10 aslında 0.until(10) çağrımıdır.Ve bu çağrım 0’dan 9’a kadar değer döner gider.Fakat 10 değerini dönmez.
Eğer index’e ihtiyaç duymuyorsak aşağıdaki gibi array’i gezinebiliriz.
for( elem <- a )
4-) Transforming Arrays
Bu bölüme kadar hemen hemen Java’da yapabildiğimiz array işlemlerini gördük.Bu alt başlıkta Scala’nın Java oranla array işlemlerini nasıl basitleştirdiğini göreceğiz.
val aBuffer = ArrayBuffer[Int](1,2,3)
val result = for(elem<-aBuffer) yield 2 * elem // result = ArrayBuffer(2,4,6) değerlerini içerir
yield fonksiyonu orjinal tip ve değerlerden oluşan yeni bir collection oluşturur.Daha sonra bu yeni array’in her bir değerini 2 ile çarpıp result değişkenine atanır.
Scala’da collection yapıları üzerinde map ve filter methodlarını kullanabilriz.Örneğinde yukarıdaki işlemi aşağıdaki gibi de gerçekleyebiliriz.
val test = aBuffer.map( _ * 2)
map ile _ karakteri ile aBuffer array’nin her elemanını 2 ile çarpar ve geriye yeni bir array dönderir.Ayrıca collection üzerinde filter methodu ile array’in elemanların filtreyebiliriz.
val test 2 =aBuffer.filter( _ % 2 ==0 )
aBuffer array’nin 2 ile bölünebilen elemanlarını bulur ve yeni bir array’e atar.
5-) Common Algorithms
Scala’da toplama ve sıralama işlemleri için built-in fonksiyonlar vardır.
Array(1,7,2,9).sum //19
Array’daki tüm değerleri toplar. sum methodunu kullanabilmek için eleman tipleri numeric olmalıdır. Benzer bir şekilde min ve max methodları ile collection içerisindeki en küçük ve en büyük elemanları elde edebiliriz.
ArrayBuffer("scala","çok","kullanışlıdır").max //"kullanışlıdır" değeri döner
sorted methodu ile bir array veya arraybuffer içerisindeki elemanları sıralayabiliriz.
val b = ArrayBuffer(1,7,2,9) val bSorted = b.sorted //b değişmedi.bSorted ise (1,2,7,9) olur
Eğer collection üzerinde özel bir sorting yapmak istiyorsak,sortWith methodunu kullanabiliriz. val bDescending= b.sortWith(_ > _) // ArrayBuffer(9,7,2,1)
Son olarak eğer bir array/arrayBuffer dizilerinin elemanları print etmek istiyorsak bunun için mkString methodunu kullanabiliriz.
b.mkString(" and ")
//"1 and 2 and 7 and 9"
Scala’da array ve array buffer üzerinden kullanabileceğiz bir sürü method bulunmakta.Bunların hepsini burada anlatmaya yerimiz yetmez.Aşağıdaki linkten bu methodları inceleyebilrsiniz.
http://www.scala-lang.org/api/2.11.5/index.html#scala.collection.mutable.ArrayOps
6-) Multidimensional Arrays
Scala’da çok boyutlu array tanımlamak için ofDim methodunu kullanabiliriz.
val matrix = Array.ofDim[Double](3,4)
//Double tipinde 3 satır ve 4 kolonlu bir array.
Array’in elemanlarına erişmek için veya değer atamak için parantez çiftlerini kullanabiliriz.
matrix(satır)(kolon) = 42
Yazdığımız kod örneklerini github üzerinden inceleyebilirsiniz.
https://github.com/mstzn36/scala-examples
EOF
Kaynakça
http://horstmann.com/scala/
http://www.scala-lang.org/api/2.11.5/index.html