android'e giriş eğitimleri 1_2

83
Android‘e Giriş Eğitimi Dökümanları 1/2 Android Uygulama Geliştirme Ortamının İncelenmesi Bilgi Teknolojisi Eğitim Programları Bu Çalışma Univerist Materyal geliştirme ekibi tarafından Bilgi Teknolojileri Eğitimleri için derlenmiştir. Dökümanla ilgili kaynaklar makalenin sonunda “Kaynakça” kısmında detaylı bir şekilde belirtilmiştir.

Upload: univerist

Post on 23-Feb-2017

369 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Android'e Giriş Eğitimleri 1_2

Android‘e Giriş Eğitimi Dökümanları 1/2

Android Uygulama Geliştirme Ortamının İncelenmesi Bilgi Teknolojisi Eğitim Programları

Bu Çalışma Univerist Materyal geliştirme ekibi tarafından Bilgi Teknolojileri Eğitimleri için derlenmiştir. Dökümanla ilgili kaynaklar

makalenin sonunda “Kaynakça” kısmında detaylı bir şekilde belirtilmiştir.

Page 2: Android'e Giriş Eğitimleri 1_2

1

10.JAVA'DA STRİNG METODLARI

String sınıfı Java'da metinler tanımlamak için kullanılır ve bize metinler üzerinde çeşitli işlemler

gerçekleştirmemiz için yardımcı fonksiyonlar sunar. Java'da bir metin aşağıdaki gibi tanımlanabilir:

1. public class StringOrnek1 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6. }

7. }

Bu şekilde myString adında bir değişkene "Merhaba dunya" yazısını atamış oluyoruz.

Bu metinin uzunluğunu (karakter sayısını) merak edersek length metodunu çağırmamız gerekir:

1. public class StringOrnek2 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6. System.out.println("Uzunluk " + myString.length());

7. }

8. }

Böylece tanımlanan değişkende kaç karakter olduğunu konsola yazdırmış olduk. Şimdi ise konsola

sadece "dünya" kelimesinin yazılmasını sağlayalım:

1. public class StringOrnek3 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6.

7. System.out.println(myString.substring(8, myString.length()));

8. }

9. }

Eğer elimizdeki "Merhaba dunya" metnini bir dizi olarak düşünürsek harflerin dizinleri (index)

aşağıdaki şekilde olacaktır:

m e r h a b a d ü n y a

Page 3: Android'e Giriş Eğitimleri 1_2

2

0 1 2 3 4 5 6 7 8 9 10 11

Sadece "dunya" kelimesini yazdırmamız için 8. karakterden başlayarak son karaktere kadar olan

bölümü almamız gerekir. substring metodu başlangıç ve bitiş dizinleri arasında kalan karakterleri bir

String olarak döndürür:

"Merhaba" kelimesi ise aşağıdaki şekilde görüntülenir:

1. public class StringOrnek4 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6.

7. System.out.println(myString.substring(0, 7));

8. }

9. }

Yukarıdaki örnekte 0 - 7 arasındaki (0 dahil 7 hariç) karakterler konsola yazılacaktır.

Bir harfin ya da String değerinin kaçıncı dizinden (index) itibaren başladığını merak

ediyorsanız,indexOf metodunu kullanabilirsiniz. Örneğin "dunya" kelimesinin kaçıncı dizinde

olduğunu öğrenmek için

1. public class StringOrnek5 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6.

7. System.out.println("Dunya baslangici " + myString.indexOf("dunya"));

8. }

9. }

Not: indexOf metodu eğer aranan metni bulamazsa -1 döndürür. Bu şekilde metinler içinde arama

yapabilirsiniz. (örneğin “ahmet.mail.com”.indexOf(“@”) == -1 ise eposta adresi yanlış girilmiştir gibi)

Bir metni başka bir metinle karşılaştırmak için equals ya da equalsIgnoreCase metodlarını

kullanabilirsiniz. equalsIgnoreCase metodu, karşılaştırılan metni öncelikle küçük harflere çevirir ve

Page 4: Android'e Giriş Eğitimleri 1_2

3

ardından karşılaştırma yapar. Böylelikle büyük-küçük harf durumundan doğacak sorunun önüne

geçilmiş olur.

1. public class StringOrnek6 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dünya";

6.

7. if (myString.equalsIgnoreCase("merhaba dünya"))

8. System.out.println("Aynı deger");

9. }

10. }

Bir metni küçük harflere çevirmek için toLowerCase, büyük harflere çevirmek

içinse toUpperCase metodlarını kullanabilirsiniz:

1. public class StringOrnek7 {

2.

3. System.out.println("Kucuk harfler : " + myString.toLowerCase());

4.

5. }

Bir metin içerisindeki boşluklardan kurtulmak için trim metodu kullanılır. trim metodu, metnin sonunda

ve başında yer alan boşlukları yok ederken kelime aralarındaki boşluklara dokunmaz. Bu metod

özellikle kullanıcıların formlar ile gönderdiği verilerde (isim, e-posta vs.) veritabanına kayıt etmeden

önce kullanılmalıdır. Böylece olası kullanıcı hataları biraz olsun azaltılabilir ve ileride doğabilecek

karşılaştırma hatalarının önüne geçilmiş olur.

1. public class StringOrnek8 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6.

7. myString = "Merhaba dunya ";

8. System.out.println("Bosluklar yok " + myString.trim());

9.

10. }

11. }

Page 5: Android'e Giriş Eğitimleri 1_2

4

Bir metni parçalara bölmek için (örneğin boşluklara göre ayırıp kelimeleri ayıklama) split metodu

kullanılır. split metodu regex bir ifade içerisindeki kurallara göre String değişkenini böler ve bir

String[] dizisi haline getirir.

1. public class StringOrnek9 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dunya";

6.

7. String[] words = myString.split(" ");

8. }

9. }

Yukarıdaki örnekte "Merhaba dunya" metni boşluklara göre parçalanmış ve dizinin içerisinde

"Merhaba" ve "dunya" değerini taşıyan iki adet String oluşturulmuştur. Bir metin değerini İnternet

bağlantısı ya da başka bir akış (Stream) üzerinden yollamak istersek byte[] değerine çevirmemiz

gerekebilir. Bir String içerisindeki her harfin byte değerini hesaplayıp String'i byte dizisine çeviren

metod getBytes metodudur.

1. public class StringOrnek10 {

2. public static void main(String[] args) {

3.

4. // string tanımlanması

5. String myString = "Merhaba dünya";

6.

7. byte[] strByte = myString.getBytes();

8. System.out.println(new String(strByte));

9. }

10. }

Bir byte dizisi tekrar String'e dönüştürülmek istendiğinde String sınıfının yapıcılarından (Constructor)

faydalanabiliriz.

Page 6: Android'e Giriş Eğitimleri 1_2

5

String Metotlarıyla İlgili Örnek Java Programları

Örnek 1: equals

1. public class StringUyg1{

2. public static void main(String[] arg){

3. String st1="melisa";

4.

5. if(st1.equals("melisa")) {

6. System.out.println("");

7. System.out.println("string melisa dir.");

8. }

9.

10. if(st1.equals("MELISA")) {

11. System.out.println("");

12. System.out.println("string MELISA dir.");

13. }

14.

15. if(st1.equalsIgnoreCase("MELISA")) {

16. System.out.println("");

17. System.out.println("string MELISA dir.");

18. }

19. }

20. }

Programın çıktısı:

Açıklama: Yukardaki programda bulunan 3 adet if’ten ilki ve üçüncüsü doğru, ikincisi

ise yanlışolacaktır. Bu nedenle 2 mesaj alınır.

Örnek 2: length

1. public class StringUyg2 {

2. public static void main(String[] arg){

3. String st1="melisa";

4. int i;

5.

6. for(i=0; i<=st1.length()-1; i++) {

Page 7: Android'e Giriş Eğitimleri 1_2

6

7. System.out.println("");

8. System.out.println(st1.charAt(i));

9. }

10. }

11. }

Programın Çıktısı:

Açıklama: Çıktıdan kolayca anlayacağımız üzere, bu program verilen bir String'i karakterlerine

parçalayarak her karakteri bir satıra yazdırmaktadır. String'in uzunluğunu (kaç karakterden

oluştuğunu) bulmak için length metodu kullanılır.

ÖRNEK 3: Compareto Fonksiyonu

1. public class StringUyg3 {

2. public static void main(String[] arg){

3. String st1="melisa";

4. int i;

5.

6. i=0;

7. i=st1.compareTo("zehra");

8. System.out.println(st1);

9.

10. if(i==0) {

11. System.out.println("");

12. System.out.println(st1+" = "+"zehra");

13. }

14.

15. if(i>0) {

16. System.out.println("");

17. System.out.println(st1+" > "+"zehra");

Page 8: Android'e Giriş Eğitimleri 1_2

7

18. }

19.

20. if(i<0) {

21. System.out.println("");

22. System.out.println(st1+" < "+"zehra");

23. }

24.

25. System.out.println("i="+i);

26. }

27. }

Programın Çıktısı:

Açıklama: Melisa sözcüğü alfabetik ortamda Zehra'dan önce gelir ve dolayısıyla daha küçük kabul

edilir; bu nedenle i’nin sayısal değeri negatif bir tam sayı olarak atanmıştır.

Page 9: Android'e Giriş Eğitimleri 1_2

8

ÖRNEK 4: compareTo fonksiyonu1. public class StringUyg4 {

2. public static void main(String[] arg){

3. String st1="melisa";

4. int i;

5.

6. i=0;

7. i=st1.compareTo("ayse");

8.

9. System.out.println(st1);

10. if(i==0) {

11. System.out.println("");

12. System.out.println(st1+" = "+"ayse");

13. }

14.

15. if(i>0) {

16. System.out.println("");

17. System.out.println(st1+" > "+"ayse");

18. }

19.

20. if(i<0) {

21. System.out.println("");

22. System.out.println(st1+" < "+"ayse");

23. }

24. System.out.println("i="+i);

25. }

26. }

Programın Çıktısı:

Page 10: Android'e Giriş Eğitimleri 1_2

9

Açıklama: Melisa alfabetik olarak Ayse'den önce gelmediği için i’nin değeri pozitif bir sayı olarak

çıkmıştır.

ÖRNEK 5: indexOf fonksiyonu

1. public class StringUyg5 {

2. public static void main(String[] arg){

3. String st1="anadolu";

4. int i;

5.

6. i=0;

7. System.out.println("KARAKTER"+" "+"INDEKSI");

8.

9. for(i=0; i<=st1.length()-1; i++)

10. System.out.println(st1.charAt(i)

11. +" "

12. +st1.indexOf(st1.charAt(i)));

13. }

14. }

Programın Çıktısı:

Açıklama: Programda, st1 String'i içindeki anadolu karakter dizisinin her harfi ve bu harfin karakter

dizisi içindeki indisi birer satıra yazdırılmıştır.

Page 11: Android'e Giriş Eğitimleri 1_2

10

ÖRNEK 6: getChars fonksiyonu

1. public class StringUyg6 {

2. public static void main(String[] arg){

3. String st1="anadolu";

4. char karDiz[];

5. karDiz=new char[7];

6. int i=0;

7.

8. System.out.println("KARAKTER"+" "+"INDEKSI");

9. for(i=0; i<=st1.length()-1; i++) {

10. System.out.println(st1.charAt(i)

11. +" "

12. +st1.indexOf(st1.charAt(i)));

13. }

14.

15. st1.getChars(3,7,karDiz,0);

16.

17. System.out.println("Yeni dizi: ");

18. for(i=0; i<karDiz.length; i++)

19. System.out.println(karDiz[i]);

20. }

21. }

Programın Çıktısı:

Açıklama: anadolu String'inin, indisi 3 olan d karakterinden, indisi 7-1=6 olan karakterine (u) kadar

olan kısmı karDiz adlı diziye kopyalanmıştır. karDiz adlı dizinin içeriği “dolu” olarak atanmıştır.

Page 12: Android'e Giriş Eğitimleri 1_2

11

ÖRNEK 7: startsWith ve endsWith fonksiyonları

1. public class StringUyg7 {

2. public static void main(String[] arg){

3. String st1[]={"ankara","antalya","burdur","bursa","anadolu"};

4. int i;

5.

6. for (i=0; i<st1.length; i++) {

7. if(st1[i].startsWith("an")) {

8. System.out.println();

9. System.out.println(st1[i]+" stringi an harfleri ile basliyor");

10. }

11. }

12. System.out.println();

13.

14. for (i=0; i<st1.length; i++) {

15. if(st1[i].endsWith("a")) {

16. System.out.println();

17. System.out.println(st1[i]+" stringi a harfi ile bitiyor");

18. }

19. }

20. System.out.println();

21.

22. for (i=0; i<st1.length; i++) {

23. if(st1[i].startsWith("ka",2))

24. {

25. System.out.println();

26. System.out.println(st1[i]+" stringi 2. indisten itibaren ka harfleri ile basliyor");

27. }

28. }

29. }

30. }

Page 13: Android'e Giriş Eğitimleri 1_2

12

Programın Çıktısı:

Açıklama: Elemanları "ankara", "antalya", "burdur", "bursa", "anadolu" olan st1 adlı String dizisi

oluşturulmuş, bu dizinin elemanları arasında “an” ile başlayanlar, ”a” ile bitenler ve 2 ile 3 indisli

karakterleri “ka” olanlar listelenmiştir.

11.JAVA'DA TARİH İŞLEMLERİ

Java’da tarih ile ilgili işlem yapmak için Date sınıfında faydalanırız. Date sınıfı belirli bir zaman

değerini bir değişkene atamamızı ve üzerinde ekleme, çıkarma ya da dönüştürme gibi işlemler

yapmamızı sağlar. Date sınıfını new Date() yapıcısıyla oluşturduğumuzda o anın tarihine ve saatine

(kodun çalıştığı bilgisayarın saati) sahip bir zaman değişkenine sahip oluruz.

1. import java.util.Date;

2.

3. public class DateOrnek1 {

4. public static void main(String[] args) {

5.

6. Date simdikiZaman = new Date();

7. System.out.println(simdikiZaman.toString());

8. }

9. }

Bir zamanın, UNIX Timestamp değerini öğrenmek için getTime metodunu kullanabilirsiniz.

1. import java.util.Date;

2.

3. public class DateOrnek2 {

4. public static void main(String[] args) {

5.

Page 14: Android'e Giriş Eğitimleri 1_2

13

6. Date now = new Date();

7. System.out.println(now.toString());

8. System.out.println("Timestamp : " + now.getTime());

9. }

10. }

Not: UNIX Timestamp, 1 Ocak 1970 00:00 tarihinden bu yana geçen zamanın milisaniye cinsinden

değeridir. Eğer tarihi farklı bir şekilde ekrana yazmanız gerekirse, SimpleDateFormat sınıfından

yardım alabilirsiniz. Bir Date değişkenini son kullanıcının anlayabileceği bir formatta yazdırmak için

kullanılan SimpleDateFormat, aynı zamanda kullanıcının elle girdiği bir tarihi Date değişkenine

çevirebilir. Aşağıdaki örnekte zaman bilgisi, tarih yıl - ay - gün olarak yazdırılıyor.

1. import java.text.DateFormat;

2. import java.text.ParseException;

3. import java.text.SimpleDateFormat;

4. import java.util.Date;

5.

6. public class DateOrnek3 {

7. public static void main(String[] args) throws ParseException {

8.

9. Date simdikiZaman = new Date();

10. System.out.println(simdikiZaman.toString());

11. DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

12. System.out.println(df.format(simdikiZaman));

13. }

14. }

Eğer yine aynı formatta bir tarihi (örneğin 1984/01/01) Date tipinde bir değişkene atamak isterseniz

parse metodundan faydalanabilirsiniz. Bu metod verilen bir String tarih değerini Date tipine

çevirecektir. Eğer çevirme işlemi başarısız olursa ParseException fırlatılır.

Not: Hata fırlatma konusu için try / catch / finally bloklarının anlatıldığı Java’da olağan dışı durumlar

konusuna göz atabilirsiniz.

1. import java.text.DateFormat;

2. import java.text.ParseException;

3. import java.text.SimpleDateFormat;

4. import java.util.Date;

Page 15: Android'e Giriş Eğitimleri 1_2

14

5.

6. public class DateOrnek4 {

7. public static void main(String[] args) throws ParseException {

8.

9. Date simdikiZaman = new Date();

10. System.out.println(simdikiZaman.toString());

11.

12. DateFormat df = new SimpleDateFormat("yyyy/MM/dd");

13. Date tarih = df.parse("1984/01/01");

14. System.out.println(tarih);

15. }

16. }

DateFormatter ile kullanabileceğiniz diğer tanımlar aşağıdaki şekildedir:

Harf Temsil ettiği parça Örnek

y Yıl 1996; 96

M Yıl içinde ay July; Jul; 07

w Yıl içinde hafta 27

W Ay içinde hafta 2

D Yıl içinde gün 189

d Ay içinde gün 10

F Ay içinde haftanın günü 2

E Haftanın günü Tuesday; Tue

a Sabah/akşam PM

H Gün içinde saat (0-23) 0

k Gün içinde saat (1-24) 24

K Sabah/akşam için saat (0-11) 0

h Sabah/akşam için saat (1-12) 12

m Saat içinde dakika 30

Page 16: Android'e Giriş Eğitimleri 1_2

15

s Dakika içinde saniye 55

S Milisaniye 978

Son olarak tarih içerisinde belli bir günü bir değişkene atamak için Java bizlere Calendar adında bir

sınıf sunar. Bu sınıf sayesinde tarih akışı içinde herhangi bir güne ulaşabiliriz.

Aşağıda 1 Ocak 1984 tarihini temsil eden bir değişken tanımlaması yapılmıştır.

1. import java.util.Calendar;

2. import java.util.Date;

3. import java.util.GregorianCalendar;

4.

5. public class DateOrnek5 {

6. public static void main(String[] args) {

7.

8. Calendar takvim = new GregorianCalendar(1984, 01, 01);

9. Date tarih = takvim.getTime();

10. System.out.println(tarih.toString());

11. }

12. }

12.DİZİLER

Aynı veri türünden birbiriyle ilişkili verilerin bir arada tutulmasını sağlayan yapılara dizi denir. Dizinin

içerisinde yer alan her bir ayrı veriye eleman denilmektedir. Bu elemanlara indis numaraları verilir

ve bu numaralar üzerinden yerlerine ulaşılır.

Dizileri tek boyutlu ve çok boyutlu diziler şeklinde sınıflandırabiliriz.

12.1.Tek Boyutlu Diziler

Tüm programlama dillerinde olduğu gibi Java dilinde de dizi (array) yapısı son derecede önemli bir

veri yapısıdır. Dizi yapısını kısaca tanımlarsak:

Dizi, bilgisayar belleğinde aynı isim altında genellikle aynı tipten çok sayıda veriyi bir arada saklayan

veri yapısıdır. Aşağıda, x adlı bir dizinin mantıksal görünümü verilmiştir:

x

4 2 7 22 11 3

0 1 2 3 4 5

Page 17: Android'e Giriş Eğitimleri 1_2

16

Dizinin bir adı ve dizi içerisindeki elemanın dizinin kaçıncı elemanı olduğunu belirten

bir indisi (subscript, index) vardır. Örneğin, yukarıdaki x adlı dizi için x[3] ifadesi bu dizinin 3

numaralı elemanını yani 22 değerini göstermektedir. Dizinin indisi Java dilinde daima köşeli

parantez ile belirlenir:

Java dilinde bir dizinin ilk elemanının indisi daima 0’dır; son elemanın indisi ise diziye ayrılan yer

sayısının 1 eksiğine eşittir. Yukardaki x dizisinin 6 elemanı vardır; ilk elemanının indisi 0 ve son

elemanının indisi de 5’tir.

Java Programı içinde Dizinin Bildirilmesi

Bir Java programı içinde diziyi tanıtmak için, new sözcüğünü kullanarak belirli bir tipten yeni bir

nesne tanımlama yolu izlenir. Dizinin tipi, adı ve maksimum eleman sayısı bir bildiri deyimi içinde

belirtilir:

Tip DiziAdı[ ] = new Tip [ Eleman Sayısı ];

veya eşdeğeri

Tip [ ] DiziAdı = new Tip [ Eleman Sayısı ];

Örneğin, yukarıdaki x dizisi için,

int [ ] x= new int [6] ;

şeklinde bildirimde bulunulacaktır. x dizisi 6 elemanlıdır ve elemanları int türündedir.

Dizi İçin Ne Gereklidir?

Dizi yapısına, aynı türden bir veri grubunu tümüyle bellekte saklı tutmanın gerekli olduğu

uygulamalarda ihtiyaç duyarız. Örneğin, verilerin sıralanması, bir veri grubuna ait bazı istatistiksel

bilgilerin hesaplanması (standart sapma vb.) gibi uygulamalar bu tür uygulamalardandır.

Örnek:

Aşağıda aynı işlemi gerçekleştiren iki farklı Java programı verilmiştir. Her iki program da, bilgisayara

girilen 5 adet sayının toplamını bulmaktadır.

Dizi kullanmayan sürüm

1. import java.util.Scanner;

Page 18: Android'e Giriş Eğitimleri 1_2

17

2.

3. public class Dizi1{

4. public static void main(String[] args){

5. Scanner giris = new Scanner(System.in);

6. int girilenSayi, toplam, i ;

7. toplam = 0;

8. girilenSayi = 0;

9. for (i = 1; i <= 5; i++) {

10. System.out.print("Bir sayi giriniz: ");

11. girilenSayi = giris.nextInt();

12. toplam = toplam + girilenSayi;

13. }

14. System.out.println(i-1+ " tane sayi girdiniz.");

15. System.out.println("Toplami " +toplam+ " ediyor.");

16. }

17. }

Bu programın şöyle bir çıktısı olacak:

Not: Scanner sınıfı bir akıştan (Stream) gelen veriyi bir değişkene atamak için

kullanılmıştır. System.in akışı, kullanıcının konsola veri girmesi için kullanılır.

Dizi kullanan sürüm

1. import java.util.Scanner;

2.

3. public class Dizi2{

4. public static void main(String[] args){

5. Scanner giris = new Scanner(System.in);

6. int sayi[] = new int[6];

7. int toplam, i;

8. toplam = 0;

9. for (i = 1; i <= 5; i++) {

10. System.out.print("Bir sayi giriniz: ");

Page 19: Android'e Giriş Eğitimleri 1_2

18

11. sayi[i] = giris.nextInt();

12. toplam = toplam + sayi[i];

13. }

14. System.out.println("Girdiniz sayilarin toplami: " + toplam);

15. System.out.println("Sayi dizisinin ikinci elemani: " + sayi[2]);

16. }

17. }

Bu programın çıktısı şöyle olacak:

Örnekte, dizi kullanmayan sürümde, bilgi giriş ortamından girilecek

olan sayılar (sırasıyla 4, 7, 8, 11, 2 sayıları) toplanacak ve sonuç t=32 olarak bulunacak ve

yazdırılacaktır.

Aslında, ikinci sürümde de aynı veriler girildiği takdirde, sonuçta gene t = 32 şeklinde bu sayıların

toplamı yazdırılacaktır.

Bu iki program arasında çok önemli bir fark mevcuttur: dizi kullanmayan sürümde, girilen her

sayı,girilenSayi adlı değişkende saklanacak ve her seferinde o andaki girilenSayi değişkeninin

değeri o ana kadar olan sayılar toplamını saklayan toplam değişkenine eklenecektir. Her yeni sayı

girildiğinde,girilenSayi değişkeninde saklı bulunan bir önceki sayı değeri silinecektir. Bu durumda

programın sonundagirilenSayi değişkeninde en son girilen değer olan 2 değeri saklanacaktır.

System.out.println(girilenSayi+ " tane sayi girdiniz.");

deyimi ile yazdırılan sayı da bu olacaktır.

Dizi kullanmayan sürümde, örneğin program sonunda ”Girdiğimiz 3. sayı neydi?” diye merak eder

ve bunu yazdırmak istersek bunun olanaksız olduğunu görürüz.

Oysa ikinci sürümde dizi kullanıldığı için her sayı, sayi dizisinin bir elemanı olarak sonuna kadar

bellekte saklanır. Bu noktada program sonunda,

Page 20: Android'e Giriş Eğitimleri 1_2

19

System.out.println("Sayi dizisinin ikinci elemani: " + sayi[2]);

deyimiyle 3. sayıyı yazdırmamız mümkündür.

Dizilere Başlangıç Değeri Atanması

Birçok bilgisayar dilinde olduğu gibi, Java dilinde de dizilere dizinin tanımlanması esnasında

başlangıç değeri atanması mümkündür. Örneğin,

int [ ] x ={3,-2,1,4,11};

şeklindeki bildiri deyimi ile, x dizisine aşağıdaki gibi değerler atanmıştır:

Örnek: Başlangıç Değeri Atanması

1. public class Dizi3 {

2. public static void main(String[] args){

3. int [] sayi={2,1,5,3,6};

4. double toplam = 0;

5. int i;

6. for(i=0; i<=4; i++) {

7. toplam=toplam+sayi[i];

8. }

9. System.out.println("Toplam: "+toplam);

10. }

11. }

Burada çıktımız şu şekilde gerçekleşecek:

Dizi Tanımında Diğer Bir Yöntem

Dizi boyutunu bir değişken olarak tanımladıktan sonra diziyi tanımlarken bu değişkeni kullanmamız

da mümkündür. Aşağıdaki komutlarla 5 elemanlı bir dizi tanımlayabiliyor fakat diziye ilk değer

ataması yapamıyoruz:

1. int DIZI_BOYUT=5;<br />

2. int [] sayi;<br />

3. sayi=new int[DIZI_BOYUT];

Page 21: Android'e Giriş Eğitimleri 1_2

20

Örnek: Dizi Boyutunun Bir Değişkenle Belirtilmesi

1. import java.util.Scanner;

2.

3. public class Dizi4{

4. public static void main(String[] args){

5. Scanner giris = new Scanner(System.in);

6. int DIZI_BOYUT = 5;

7. int[] sayi;

8. sayi = new int[DIZI_BOYUT];

9. int toplam=0;

10. int i;

11.

12. for (i = 0; i &lt;= 4; i++) {

13. System.out.print(i + ". dizi elemanini giriniz: ");

14. sayi[i] = giris.nextInt();

15. toplam = toplam + sayi[i];

16. }

17.

18. System.out.println("Toplam: " + toplam);

19. }

20. }

Programın çıktısı:

12.2.Bir Fonksiyon Parametresi Olarak Diziler

Fonksiyonlar ve fonksiyon parametreleri konusunda bir fikrimiz olduğuna göre hemen şunu

söyleyebiliriz: Bir dizi, bir fonksiyon parametresi olarak kullanılabilir. Çağıran fonksiyon ya da

program, dizi türündeki bu parametreye yine dizi türünde olmak üzere bir argüman geçirebilir. Bir

dizi, bir fonksiyon parametresi olacaksa; dizinin tipi, adı ve içi boş olan köşeli parantezler

fonksiyonun parametre listesinde görünmelidir. Örneğin,

static int topla_dizi(int[] x, int n)

gibi bir fonksiyon başlığında x tam sayı tipinde bir dizidir. n parametresi ise dizinin eleman sayısıdır.

Bu fonksiyonu çağıran fonksiyon veya program içinde, a dizisi,

int[ ]a={2,8,3,7,5};

şeklinde tanımlanmışsa, yukardaki topla_dizi adlı fonksiyon,

Page 22: Android'e Giriş Eğitimleri 1_2

21

toplam=topla_dizi(a,5);

şeklinde çağrılabilir.

Örnek: "n" Elemanlı Bir "x" Dizisinin Toplamını Bulan Bir Fonksiyon ve Çağıran Programla

Birlikte Kullanılması

1. </p>

2.

3. <p>public class Dizi5 {<br />

4. &nbsp;&nbsp; &nbsp;public static void main(String[] args){<br />

5. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int[] a={2,8,3,7,5};<br />

6. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int toplam;<br />

7. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;toplam=topla_dizi(a,5);<br />

8. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Toplam: "+toplam);<br />

9. &nbsp;&nbsp; &nbsp;}</p>

10.

11. <p>&nbsp;&nbsp; &nbsp;static int topla_dizi(int [] x,int n){<br />

12. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int i, ictoplam;<br />

13. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ictoplam=0;<br />

14. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(i=0; i&lt;n; i++) {<br />

15. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ictoplam+=x[i];<br />

16. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />

17. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return ictoplam;<br />

18. &nbsp;&nbsp; &nbsp;}<br />

19. }</p>

20.

21. <p>Bu kodun çıktısı:

Page 23: Android'e Giriş Eğitimleri 1_2

22

12.3.Çok Boyutlu Diziler

Çok boyutlu diziler içinde en yaygın kullanım alanı iki boyutlu diziler için söz konusudur.

Elimizde aşağıdaki gibi bir veri mevcut olsun:

1998 Yılı Otomobil Satışları

(Not: Tablodaki rakamlar gerçek değildir, örnek amaçlı verilmiştir.)

MARKA OCAK ŞUBAT MART

Fiat 700 600 650

Renault 900 800 700

VW 300 400 350

Opel 500 450 470

Ford 600 500 480

Bu tabloda, 1998 yılında çeşitli otomobil markaları için gerçekleştirilen ilk üç aylık satışları görüyoruz.

Bu tür bir bilgiyi bilgisayara yükleyerek aşağıdaki sorulara cevap olabilecek işlemleri tablo üzerinde

gerçekleştirmek isteyebiliriz:

a. Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)

b. Her ay için tüm markaların satış toplamları nelerdir? (Tabloda sütun toplamlarının hesaplanması)

c. Her marka için en çok satışın gerçekleştirildiği ay hangisidir? (Satırlardaki en büyük elemanların

tespiti)

d. Her ay için en çok satışın gerçekleştirildiği marka hangisidir? (Sütunlardaki en büyük elemanların

tespiti)

e. Tüm marka ve tüm aylar için otomobil satışları toplamı nedir? (Tablonun genel toplamının

bulunması)

Tablodaki bilgileri Java dilinde, bilgisayar belleğinde iki boyutlu dizi (two dimensional

array) yapısı adı verilen yapı içinde saklayabiliriz. Matematikteki matris yapılarının Java'daki doğal

karşılığı da bu tip iki boyutlu dizi yapısıdır.

Yukarıdaki tablo içinde, sayısal olmayan bilgileri ve başlıkları ihmal ederek sadece satışlardan

oluşan sayısal bilgiyi dikkate alırsak ve bu bilgiyi satis adlı bir tabloda saklarsak, aşağıdaki yapıyı

elde ederiz:

Page 24: Android'e Giriş Eğitimleri 1_2

23

satis

700 600 650

900 800 700

300 400 350

500 450 470

600 500 480

Java'da, 5 satır ve 3 sütundan oluşan bu tabloyu aşağıdaki şekilde tanımlayabiliriz:

int [,] satis=new int [5,3];

Burada satis adlı iki boyutlu dizinin bir elemanına referans vermek için program içinde,

şeklinde bir ifade kullanırız. Burada satis dizinin adı, i satır indisi ve j de sütun indisidir.

Satis dizisinin satır indisleri 0'dan başlar ve 4'e kadar devam eder. Sütun indisleri ise, 0 ile 2 arasında

değerler alır. Aşağıda, satis dizisinin bellekte Java tarafından saklanan biçimini görüyoruz:

Buna göre, satis[0,0] elemanı 700, satis[2,1] elemanı 400 ve satis[4,2] elemanı ise 480’dir.

Satis adlı iki boyutlu dizinin eleman sayısı ise 5x3=15’tir.

İki boyutlu dizinin elemanlarını okutmak

İki boyutlu dizinin elemanlarını Java programının çalıştırılması sırasında klavyeden girmek için

aşağıdaki gibi bir program kullanabiliriz.

Page 25: Android'e Giriş Eğitimleri 1_2

24

Aşağıdaki örnek programda 3 satır ve 2 sütunu olan satis adlı tablonun elemanları klavyeden giriliyor

ve daha sonra tablo ekrana aktarılıyor. Şimdi bu örnek programı inceleyelim:

1. import java.util.Scanner;

2.

3. public class CokBoyutluDizi1 {

4. public static void main(String[] args){

5. Scanner giris = new Scanner(System.in);

6. int[][] satisTablosu = new int[3][2];

7. int i, j;

8.

9. /* kullanıcıdan satış tablosu

10. * bilgilerini alalım */

11. System.out.print("Satis [0,0]=");

12. satisTablosu[0][0] = giris.nextInt();

13.

14. System.out.print("Satis [0,1]=");

15. satisTablosu[0][1] = giris.nextInt();

16.

17. System.out.print("Satis [1,0]=");

18. satisTablosu[1][0] = giris.nextInt();

19.

20. System.out.print("Satis [1,1]=");

21. satisTablosu[1][1] = giris.nextInt();

22.

23. System.out.print("Satis [2,0]=");

24. satisTablosu[2][0] = giris.nextInt();

25.

26. System.out.print("Satis [2,1]=");

27. satisTablosu[2][1] = giris.nextInt();

28.

29. /* bellekteki satis tablosu

30. * elemanlarının ekrana yazdırılması */

31. System.out.println("Satis tablonuz");

32. for (i = 0; i &lt;= 2; i++) {

33. for (j = 0; j &lt;= 1; j++) {

34. System.out.print(satisTablosu[i][j] + " ");

35. }

Page 26: Android'e Giriş Eğitimleri 1_2

25

36. System.out.println();

37. }

38. }

39. }

Programın çıktısı şu şekilde oluşacak:

İki Boyutlu Dizi Elemanlarına İlk Değer Atanması

İki boyutlu dizinin elemanları sabit olacaksa yani program her çalıştırıldığında değerleri

değişmiyorsa, bu durumda iki boyutlu dizi elemanlarına programın içinde ilk değer ataması

yapabiliriz.

İlk değer ataması, iki boyutlu dizi değişebilecek olsa bile, dizi üzerinde gerçekleştirilecek tekrarlı bazı

işlemler için de bir başlangıç değeri oluşturmak için gerekli olabilir. satisTablosu adlı dizinin

elemanlarını kod bloku içinde ilk değer ataması yoluyla aşağıdaki gibi oluşturabiliriz:

1. int[][] satisTablosu = new int[][]{

2. {700,600,650},

3. {900,800,700},

4. {300,400,350},

5. {500,450,470},

6. {600,500,480}

7. };

Burada açıkça gördüğümüz gibi, satisTablosu adlı dizinin her satırı { } sembolleri arasında yer alıyor

ve satır elemanları birbirinden virgüllerle ayrılıyor. Ayrıca her satır bloku arasına da virgül ayraçları

koymamız gerekiyor. Tüm satır blokları da en dışta bir { } sembolleri ile blok içine alınıyor.

Aşağıdaki Java programı, satisTablosu adlı diziye ilk değer ataması yapıyor ve tablo elemanlarını

ekrana yazdırıyor:

1. public class CokBoyutluDizi2 {

2. public static void main(String[] args){

3. int [][]satisTablosu = new int[][]{

4. {700,600,650},

5. {900,800,700},

6. {300,400,350},

Page 27: Android'e Giriş Eğitimleri 1_2

26

7. {500,450,470},

8. {600,500,480}};

9. int i,j;

10.

11. /*bellekteki satis tablosu

12. * elemanlarının ekrana yazdırılması*/

13. System.out.println("Satis tablosu");

14. for(i=0; i&lt;=4; i++){

15. for(j=0; j&lt;=2; j++) {

16. System.out.print(satisTablosu[i][j]+" " );

17. }

18. System.out.println();

19. }

20. }

21. }

Programın çıktısına hep birlikte bakalım:

Length Fonksiyonunun Kullanılması

length fonksiyonu ile iki boyutlu dizinin her bir boyutundaki eleman sayısını bulmamız mümkün.

satisTablosu adlı dizi yukardaki gibi tanımlanmışsa satisTablosu.length ifadesi 0. boyuta ait

eleman sayısını yani satır sayısını (5), satisTablosu[0].length ifadesiyse 1. boyuta ait eleman

sayısını yani sütun sayısını (3) verecektir. Aşağıdaki Java kodu, bu fonksiyonların nasıl

kullanılabileceğini gösteriyor:

1. public class CokBoyutluDizi3 {

2. public static void main(String[] args){

3. int [][]satisTablosu = new int[][]{

4. {700,600,650},

Page 28: Android'e Giriş Eğitimleri 1_2

27

5. {900,800,700},

6. {300,400,350},

7. {500,450,470},

8. {600,500,480}

9. };

10. int i,j;

11.

12. /*bellekteki satis tablosu

13. * elemanlarının ekrana yazdırılması*/

14. System.out.println("Satis tablosu");

15. /*

16. * döngülerin sınırlarını length()

17. * fonksiyonlarıyla belirliyoruz

18. * */

19. for(i=0; i&lt;satisTablosu.length; i++) {

20. for(j=0; j&lt;satisTablosu[0].length; j++) {

21. System.out.print(satisTablosu[i][j]+" " );

22. }

23. System.out.println();

24. }

25. }

26. }

Program çıktısı:

ÖRNEK: Satış Tablosunun Satır ve Sütun Toplamlarının ve Tablodaki Elemanların Genel

Toplamının Bulunması

1. public class CokBoyutluDizi4 {

2. public static void main(String[] args){

3. int [][]satisTablosu = new int[][]{

4. {700,600,650},

5. {900,800,700},

6. {300,400,350},

7. {500,450,470},

Page 29: Android'e Giriş Eğitimleri 1_2

28

8. {600,500,480}

9. };

10. int i, j, toplamSatis, toplamOtomobilSayisi=0;

11.

12. /*bellekteki satisTablosu dizisinin

13. * elemanlarının ekrana yazdırılması*/

14. System.out.println("Otomobil satislari tablosu");

15. for(i=0; i&lt;satisTablosu.length; i++) {

16. for(j=0; j&lt;satisTablosu[0].length; j++) {

17. System.out.print(satisTablosu[i][j]+" " );

18. }

19. System.out.println();

20. }

21.

22. /*

23. * Her marka için 3 aylık satış toplamlarını

24. * yani dizinin satır toplamlarını yazdıralım

25. * */

26. for(i=0; i&lt;=4; i++) {

27. toplamSatis=0;

28. for(j=0; j&lt;=2; j++)

29. toplamSatis=toplamSatis+satisTablosu[i][j];

30. System.out.println(i+1+". markanin toplam satisi: "+toplamSatis);

31. }

32.

33. /*

34. * Her ay için 5 markanın satış toplamlarını

35. * yani tablodaki sütunların toplamlarını

36. * gösterelim

37. * */

38. System.out.println();

39. toplamOtomobilSayisi=0;

40. for(j=0; j&lt;=2; j++){

41. toplamSatis=0;

42. for(i=0; i&lt;=4; i++)

43. {

44. toplamSatis=toplamSatis+satisTablosu[i][j];

Page 30: Android'e Giriş Eğitimleri 1_2

29

45. toplamOtomobilSayisi=toplamOtomobilSayisi+satisTablosu[i][j];}

46. System.out.println(j+1+". ayda 5 marka icin toplam satis miktari: "+toplamSatis);

47. }

48. /*3 AY ICIN TOPLAM OTOMOBIL SATISI-GENEL TOPLAM*/

49. System.out.println("3 aylik toplam otomobil satisi"+toplamOtomobilSayisi);

50. }

51. }

sProgram çıktısı:

Örnek:

Aşağıda verilen matrisi, bilgisayarda otomatik olarak oluşturacak bir Java programı yazalım.

2! 4! 6!

8! 10! 12!

14! 16! 18!

1. public class CokBoyutluDizi5 {

2. public static void main(String[] args){

3. double[][] dizi=new double[3][3];

4. int i,j,sayimiz;

5. sayimiz=2;

6. for(i=0; i&lt;=2; i++) {

7. for(j=0; j&lt;=2; j++) {

8. dizi[i][j]=faktoriyel(sayimiz);

9. System.out.println(sayimiz+"!="+dizi[i][j]);

10. sayimiz=sayimiz+2;

11. }

Page 31: Android'e Giriş Eğitimleri 1_2

30

12. }

13. }

14.

15. static double faktoriyel(int n){

16. double fakt;

17. int i;

18. fakt=1.0;

19. for(i=1; i&lt;=n; i++) {

20. fakt=fakt*i;

21. }

22. return fakt;

23. }

24. }

Programın çıktısı şöyle olacaktır:

Örnek:

Önceden belirleyeceğimiz 3'e 4'lük bir tabloda yer alan elemanların en küçük ve en büyük değerdeki

elemanı bulan bir Java programı yazalım. Ayrıca bu program her satırdaki ve sütundaki en küçük

ve en büyük elemanları da bulabilsin.

1. public class CokBoyutluDizi6 {

2. public static void main(String[] args){

3.

4. double[][] tablo=new double [][]{

5. {34,11,-7,53},

6. {254,8,-65,4},

7. {110,64,33,26}

8. };

9. int i,j;

10. double kucukEleman, buyukEleman, enKucuk, enBuyuk;

11.

Page 32: Android'e Giriş Eğitimleri 1_2

31

12. /*tablonun yazdırılması*/

13. System.out.println("Dizinin Elemanlari");

14. for(i=0; i&lt;=2; i++) {

15. for (j=0; j&lt;=3; j++) {

16. System.out.print(tablo[i][j]+"\t");

17. }

18. System.out.println();

19. }

20.

21. /* Her satırdaki en büyük ve en küçük

22. * elemanların bulunması*/

23. for(i=0; i&lt;=2; i++) {

24. kucukEleman=3.4e38;

25. buyukEleman=-3.4e38;

26. for(j=0; j&lt;=3; j++) {

27. if(tablo[i][j]&lt;kucukEleman) {

28. kucukEleman=tablo[i][j];

29. }

30. if(tablo[i][j]&gt;buyukEleman) {

31. buyukEleman=tablo[i][j];

32. }

33. }

34. System.out.println((i+1)+". satirdaki en kucuk eleman: "+kucukEleman);

35. System.out.println((i+1)+". satirdaki en buyuk eleman: "+buyukEleman);

36. }

37.

38. /* Her sütundaki en büyük ve en küçük

39. * elemanın bulunması*/

40.

41. /* Ek olarak tablodaki en büyük ve en küçük

42. * elemanın bulunması */

43. enKucuk=3.4e38;

44. enBuyuk=-3.4e38;

45. for(j=0; j&lt;=3; j++) {

46. kucukEleman=3.4e38;

47. buyukEleman=-3.4e38;

48. for (i=0; i&lt;=2; i++) {

Page 33: Android'e Giriş Eğitimleri 1_2

32

49. if(tablo[i][j]&lt;kucukEleman) {

50. kucukEleman=tablo[i][j];

51. }

52. if(tablo[i][j]&gt;buyukEleman) {

53. buyukEleman=tablo[i][j];

54. }

55. if(tablo[i][j]&lt;enKucuk) {

56. enKucuk=tablo[i][j];

57. }

58. if(tablo[i][j]&gt;enBuyuk) {

59. enBuyuk=tablo[i][j];

60. }

61. }

62. System.out.println((j+1)+". sutundaki en kucuk eleman: "+kucukEleman);

63. System.out.println((j+1)+". sutundaki en buyuk eleman: "+buyukEleman);

64. }

65. System.out.println("Tablodaki en kucuk eleman: "+enKucuk);

66. System.out.println("Tablodaki en buyuk eleman: "+enBuyuk);

67. }

68. }

Programın Çıktısı:

Page 34: Android'e Giriş Eğitimleri 1_2

33

ÖRNEK: Matris Çarpımı

Aşağıdaki Java programı,

Cmn = Amk Bkn

şeklindeki matris çarpımı işlemini gerçekleştiriyor:

1. public class CokBoyutluDizi7 {

2. public static void main(String[] args){

3.

4. int[][] aMatris=new int [][]{{2,1},{-1,4},{5,3}};

5. int[][] bMatris=new int [][]{{3,2,1,-1},{4,-2,1,2}};

6. int[][] cMatris=new int [3][4];

7. int i,j,k,t;

8.

9. /*a ve b matrislerinin yazdırılması*/

10. System.out.println("A matrisi");

11. for(i=0; i&lt;=2; i++) {

12. for(j=0; j&lt;=1; j++) {

13. System.out.print(aMatris[i][j]+"\t");

14. }

15. System.out.println();

16. }

17.

18. System.out.println("B matrisi");

19. for(i=0; i&lt;=1; i++){

20. for(j=0;j&lt;=3;j++) {

21. System.out.print(bMatris[i][j]+"\t");

22. }

23. System.out.println();

24. }

25.

26. /* a ve matrisinin çarpımı olan

27. * c martisinin hesaplanması */

28. for(k=0; k&lt;=3; k++) {

29. for(i=0; i&lt;=2; i++) {

30. cMatris[i][k]=0;

31.

Page 35: Android'e Giriş Eğitimleri 1_2

34

32. for(j=0; j&lt;=1; j++) {

33. cMatris[i][k]=cMatris[i][k]+

34. aMatris[i][j]*bMatris[j][k];

35. }

36. }

37. }

38. System.out.println("C matrisi");

39. for(i=0; i&lt;=2; i++)

40. {

41. for(j=0;j&lt;=3;j++)

42. System.out.print(cMatris[i][j]+"\t");

43. System.out.println();

44. }

45. }

46. }

Programın Çıktısı:

ÖRNEK:

Aşağıdaki matrisi otomatik olarak oluşturan ve yazdıran bir Java programı geliştirelim.

( 2! - 1 ) / 3 ( 4! + 2 ) / 5 ( 6! - 3 ) / 7

( 8! + 4 ) / 9 ( 10! - 5 ) / 11 ( 12! + 6 ) / 13

1. public class CokBoyutluDizi8 {

2. public static void main(String[] arg){

3. double matris[][]=new double[2][3];

4. int i,j,p,u;

5. int k;

6. char isaret;

7. p=-1;

Page 36: Android'e Giriş Eğitimleri 1_2

35

8. k=2;

9. u=1;

10. for(i=0; i&lt;=1; i++) {

11. for(j=0; j&lt;=2; j++) {

12. matris[i][j]=(faktoriyel(k)+p*u)/(k+1.0);

13. if(p&lt;0) {

14. isaret='-';

15. }

16. else {

17. isaret='+';

18. }

19. System.out.println("["

20. +i+

21. "]["

22. +j+

23. "] = ("

24. +k+

25. "!"

26. +isaret+u+

27. ") / "

28. +(k+1)+

29. " = "

30. +matris[i][j]+

31. "\t");

32.

33. k=k+2;

34. p=-p;

35. u++;

36. }

37. }

38. }

39.

40. public static double faktoriyel(double sayi){

41. double fakt=1.0;

42. int i;

43. for(i=1; i&lt;=sayi; i++) {

44. fakt=fakt*i;

Page 37: Android'e Giriş Eğitimleri 1_2

36

45. }

46. return fakt;

47. }

48. }

Programın çıktısı şu şekilde olacaktır:

Örnek:

Aşağıdaki matrisin en büyük elemanının bulunduğu sütunda yer alan en küçük elemanı bulan bir

Java programı geliştirelim.

56 23 678 231

234 21 78 23

654 33 22 67

189 35 56 89

Yazılacak olan Java programı doğru çalıştığı takdirde, tablodaki en büyük elemanı 678 olan sütuna

gelip oradaki en küçük sayı olan 22'yi bulmalıdır.

1. public class CokBoyutluDizi9 {

2. public static void main(String[] arg){

3. double[][] matris={

4. {56,23,678,231},

5. {234,21,78,23},

6. {654,33,22,67},

7. {189,35,56,89}

8. };

9. int i,j,k;

10. k=0;

11. double enBuyuk,enKucuk;

12. enBuyuk=matris[0][0];

13. for(i=0; i&lt;=3; i++){

Page 38: Android'e Giriş Eğitimleri 1_2

37

14. for(j=0; j&lt;=3; j++){

15. if(matris[i][j]&gt;enBuyuk)

16. {

17. enBuyuk=matris[i][j];

18. k=j;

19. }

20. System.out.print("["+i+"]["+j+"]=" + matris[i][j]+"\t");

21. }

22. System.out.println();

23. }

24. enKucuk=matris[0][k];

25. for(i=0; i&lt;=3; i++) {

26. if(matris[i][k]&lt;enKucuk) {

27. enKucuk=matris[i][k];

28. }

29. }

30. System.out.println("En buyuk elemanin bulundugu sutundaki en kucuk sayi"+enKucuk);

31. }

32. }

Programın çıktısını aşağıda bulabilirsiniz:

Örnek:

Aşağıdaki matrisin içindeki en küçük ikinci elemanı bulan bir Java programı geliştirelim.

56 23 678 231

234 21 78 26

654 33 32 67

189 35 56 89

Program, bu tablo içindeki en küçük ikinci eleman olan 23’ü bulmalıdır.

1. public class CokBoyutluDizi10 {

2. public static void main(String[] arg){

3. double[][] matris={

Page 39: Android'e Giriş Eğitimleri 1_2

38

4. {56,23,678,231},

5. {234,21,78,26},

6. {654,33,32,67},

7. {189,35,56,89}

8. };

9. int i,j,y,x;

10. y=0;

11. x=0;

12. double enKucuk;

13. enKucuk=matris[0][0];

14. for(i=0; i&lt;=3; i++) {

15. for(j=0; j&lt;=3; j++){

16. if(matris[i][j]&lt;enKucuk) {

17. enKucuk=matris[i][j];

18. x=i;

19. y=j;

20. }

21. System.out.println("["+i+"]["+j+"] = "+matris[i][j]+"\t");

22. }

23. }

24. matris[x][y]=100000000000.0;

25. enKucuk=matris[0][0];

26. System.out.println("");

27. for(i=0; i&lt;=3; i++){

28. for(j=0; j&lt;=3; j++){

29. if(matris[i][j]&lt;enKucuk)

30. {

31. enKucuk=matris[i][j];

32. y=j;

33. x=i;

34. }

35. System.out.print("["+i+"]["+j+"]=" + matris[i][j]+" ");

36. }

37. System.out.println("");

38. }

39. System.out.println("");

40. System.out.println("");

Page 40: Android'e Giriş Eğitimleri 1_2

39

41. System.out.println("Matristeki ikinci en kucuk eleman: "+enKucuk);

42. System.out.println("Bu elemanin satir ve sutunu "+x+"'a "+y);

43. }

44. }

Programın çıktısı:

Örnek:

Aşağıdaki matrisin içindeki tek sayıları tek boyutlu bir diziye yükleyen ve bu diziyi sıralayan bir Java

programı geliştirelim.

56 23 678 231

234 21 78 26

654 33 32 67

189 35 56 89

Tablodaki tek sayılar koyu hale getirilmiştir. Yazılacak program bu sayıları tek boyutlu diziye

yükleyerek sıralamalıdır.

1. public class CokBoyutluDizi11 {

2. public static void main(String[] arg){

3. int[][] matris={

4. {56,23,678,231},

5. {234,21,78,26},

6. {654,33,32,67},

Page 41: Android'e Giriş Eğitimleri 1_2

40

7. {189,35,56,89}

8. };

9. int i,j,k;

10. k=0;

11. int temp=0;

12. int[] tekSayilar=new int[16];

13.

14. /*tek sayıları bulalım*/

15. for(i=0; i&lt;=3; i++) {

16. for(j=0; j&lt;=3; j++) {

17. if (matris[i][j]/2*2 != matris[i][j]) {

18. tekSayilar[k]=matris[i][j];

19. k++;

20. }

21. System.out.print("["+i+"]["+j+"]=" + matris[i][j]+"\t");

22. }

23. System.out.println();

24. }

25.

26. System.out.println();

27. System.out.println("Tek sayilardan olusan dizi:");

28. for(i=0; i&lt;=k-1; i++) {

29. System.out.print(tekSayilar[i]+"\t");

30. }

31. System.out.println();

32. System.out.println();

33.

34. /*tek sayılardan oluşan diziyi küçükten

35. * büyüğe olacak şekilde sıralayalım*/

36. for(i=0; i&lt;tekSayilar.length; i++) {

37. for(j=0; j&lt;tekSayilar.length; j++) {

38. if(tekSayilar[i]&gt;tekSayilar[j]) {

39. temp=tekSayilar[i];

40. tekSayilar[i]=tekSayilar[j];

41. tekSayilar[j]=temp;

42. }

43. }

Page 42: Android'e Giriş Eğitimleri 1_2

41

44. }

45. System.out.println("Tek sayilardan olusan dizinin siralanmis hali:");

46. for(i=k-1; i&gt;=0; i--) {

47. System.out.print(tekSayilar[i]+"\t");

48. }

49. }

50. }

Programın çıktısı:

ÖRNEK:

Alfabetik karakterlerden oluşan aşağıdaki matris veriliyor:

m a v b

z y c e

g f p q

r h i k

Bu matristeki c-r arasındaki harfleri tek boyutlu bir diziye yerleştirerek bu diziyi sıralayan bir Java

programı geliştirelim.

1. public class CokBoyutluDizi12 {

2. public static void main(String[] arg){

3. char[][] matris={

4. {'m','a','v','b'},

5. {'z','y','c','e'},

6. {'g','f','p','q'},

7. {'r','h','i','k'}

8. };

9.

10. int i,j,k;

Page 43: Android'e Giriş Eğitimleri 1_2

42

11. k=0;

12. char temp;

13. char[] harfler=new char[16];

14.

15. /*dizideki harflerden c-r arasınd

16. * olanları bulalım */

17. for(i=0; i&lt;=3; i++){

18. for(j=0; j&lt;=3; j++) {

19. if(matris[i][j]&gt;='c' &amp;&amp; matris[i][j]&lt;='r') {

20. harfler[k]=matris[i][j];

21. k++;

22. }

23. System.out.print("["+i+"]["+j+"]=" + matris[i][j]+"\t");

24. }

25. System.out.println();

26. }

27.

28. /*c-r arası harfleri ekrana basalım*/

29. System.out.println();

30. System.out.println("c-r arasi harfler: ");

31. for(i=0; i&lt;=k-1; i++) {

32. System.out.print(harfler[i]+" ");

33. }

34.

35. /*c-r arasındaki harfleri sıralayalım*/

36. for(i=0; i&lt;harfler.length; i++){

37. for(j=0; j&lt;harfler.length; j++){

38. if(harfler[i]&gt;harfler[j]) {

39. temp=harfler[i];

40. harfler[i]=harfler[j];

41. harfler[j]=temp;

42. }

43. }

44. }

45.

46. System.out.println();

47. System.out.println("Siralanmis halleri: ");

Page 44: Android'e Giriş Eğitimleri 1_2

43

48. /*sıralanan harfleri ekrana basalım*/

49. for(i=k-1; i&gt;=0; i--) {

50. System.out.print(harfler[i]+" ");

51. }

52. }

53. }

Programın çıktısı:

Android uygulamalarında, özellikle uzaktaki bir kaynaktan ya da veri tabanından çoklu veri

çektiğinizde dizi yapılarını kullanıyor olacağız.

13.OLAĞAN DIŞI DURUMLARIN DEĞERLENDİRİLMESİ

En üst düzey geliştiricilerin bile zaman zaman hatalı kod yazabildiğini biliyoruz.

Bir programın çalışması esnasında normalde karşılaşılmaması gereken bir durum oluşursa,

sektörde bunaolağan dışı durum (exception) ve bu durumda ne yapılacağının belirlenmesine

de olağan dışı durum yönetimi (exception handling) denir.

Bir bölme işleminde paydanın 0 olması, beklenmeyen ya da olağan dışı bir durumdur. Aynı şekilde

bir dosyaya erişim yapmak isteyen bir komutun o dosyayı bulamaması da olağan dışı bir durumdur.

C++ diline kadar, olağan dışı durumların tespiti ve yönetimi yazılımcıların özel olarak geliştirdikleri

kod parçalarıyla yapılabiliyordu. C++ dilinden itibaren olağan dışı durum yönetimi, dilin içine eklenen

özel komut, sınıf ve metotlarla yapılabiliyor. Java ile birlikte, Microsoft Visual Studio.Net’in üç temel

dili olan Visual Basic.net, C#.net ve C++.net’te olağan dışı durum yönetimi, try / catch /

finally yapısı ve ilgili sınıf ve metotlarla gerçekleştirilebiliyor.

13.1.try/catch/finally Yapısı

try/catch/finally yapısının kullanılışı şöyledir:

1. try<br />

2. {<br />

3.

&nbsp;&nbsp;&nbsp;&nbsp;//hesaplanmak&nbsp;istenen&nbsp;ifade&nbsp;&nbsp;&nbsp;&

nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />

4. }<br />

Page 45: Android'e Giriş Eğitimleri 1_2

44

5.

catch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<

br />

6. {<br />

7.

&nbsp;&nbsp;&nbsp;&nbsp;//Bir&nbsp;hata&nbsp;türü&nbsp;tespit&nbsp;edilince&nbsp;ver

ilmesi&nbsp;gereken&nbsp;mesaj<br />

8. }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />

9.

catch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<

br />

10. {<br />

11.

&nbsp;&nbsp;&nbsp;&nbsp;//başka&nbsp;Bir&nbsp;hata&nbsp;türü&nbsp;tespit&nbsp;edili

nce&nbsp;verilmesi&nbsp;gereken&nbsp;mesaj<br />

12. }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />

13. finally<br />

14. {<br />

15. &nbsp;&nbsp;&nbsp;&nbsp;//her&nbsp;durumda&nbsp;çalıştırılacak

olan&nbsp;kod&nbsp;parçası<br />

16. }

Yukarıdaki yapıyı şöyle açıklayabiliriz:

try bloğu içinde hesaplanacak ifade yer alır. Bu ifadenin hesaplanmasında bir

hata oluşmamışsa,catch blokları atlanarak programın çalışması finally bloğu ile devam eder

ve daha sonra programın bu bloğu izleyen kısmına geçilir.

try bloğu içindeki işlemde bir hata oluşmuşsa, catch bloklarından hangisi bu hatayı

algılayabiliyorsa o catch bloğu içine girilir ve gerekli hata mesajı yazdırılır. Daha sonra

program finally bloğu ile yukarıda açıklandığı biçimde çalışmaya devam eder.

Not: finally bloğu ne olursa olsun çalışacağından burada genellikle try bloğu içinde bellek hatalarına

(memory leak gibi) ya da açık kalmış bağlantılara yol açabilecek değişkenler yok edilri.

Şimdi basit bir örnekle try/catch bloklarını açıklayalım:

1. public class Main {<br />

2. &nbsp;&nbsp; &nbsp;public static void main(String[] args) {<br />

3. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;try {<br />

4. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int a = 42 / 0;<br />

Page 46: Android'e Giriş Eğitimleri 1_2

45

5. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} catch (ArithmeticException MatematikselHata)

{<br />

6. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println(" İşlem

yapılırken matematiksel bir hata oluştu :" + MatematikselHata.getMessage());<br />

7. &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />

8. &nbsp;&nbsp; &nbsp;}<br />

9. }

Burada ArithmeticException programda herhangi bir aritmetiksel hata olduğunda sistemin

yanıtıdır. Örnek kodumuzda ArithmeticException Matematiksel hata olarak aktarılmış bu da

dışarıya output olarak verilmiştir.

try/catch/finally yapısında kullanırken alınabilecek exception türleri aşağıdadır. Yapılan programa

göre hangi hata durumlarında programınızın nasıl tepki vereceğine karar verebilirsiniz.

Örnek Exception Türleri

Hata Tipleri Hatanın Anlamı

ArithmeticException Aritmatiksel bir işlem sırasında oluşan hata

ArrayIndexOutOfBoundsException Array sınırlarından çıkılma hatası

ArrayStoreException Array yapısına uymayan bir değer kaydedilmeye

çalışıldığında

ClassCastException Uygunsuz class atama işlemi

IllegalArgumentException Uygun olmayan argüman kullanımı

IllegalMonitorStateException Uygun olmayan monitör işlemi

IllegalStateException Sistemin uygun pozisyonda olmadığını belirtir

IllegalThreadStateException Tread durumunun uygun olmadığını belirtir

IndexOutOfBoundsException Index'in sınırlardan çıkılma hatası

NegativeArraySizeException Array'in boyutuna negatif değer verilmiş olması hatası

Page 47: Android'e Giriş Eğitimleri 1_2

46

Örnek Exception Türleri

Hata Tipleri Hatanın Anlamı

NullPointerException Boş pointer hatası

NumberFormatException Uygun olmayan sayı formatı hatası

SecurityException Güvenlik hatası

StringIndexOutOfBounds String yapısının sınırlarından çıkma hatası

UnsupportedOperationException Desteklenmeyen işlem hatası

ClassNotFoundException Class bulunmama hatası

CloneNotSupportedException Çoğalmaya çalışılan bir objenin çoğalamayacağını belirten

hata

IllegalAccessException Uygunsuz erişim hatası

InstantiationException Bir objenin oluşturulması esnasında oluşan hata

InterruptedException Bir tread'in diğer tread'i durdurma hatası

NoSuchFieldException Aranılan alanın olmadığı hatası

NoSuchMethodException Kıllanılan methodun bulunmama hatası

Şimdi başka bir örneğe göz atalım:

1. package com.turkcell.and101;

2.

3. import java.io.File;

4. import java.io.FileWriter;

5. import java.io.IOException;

6.

7. public class ExceptionOrnek1 {

8. public static void main(String[] args) {

9.

10. String str = "Bunu dosyaya yazdir";

11. File file = new File("dosya.txt");

12. FileWriter fileWriter = null;

13.

Page 48: Android'e Giriş Eğitimleri 1_2

47

14. try {

15. fileWriter = new FileWriter(file, false);

16. fileWriter.write(str);

17. }

18. catch (IOException dosyaHatasi) {

19. dosyaHatasi.printStackTrace();

20. }

21. finally {

22. try {

23. if (fileWriter != null)

24. fileWriter.close();

25. }

26. catch (Exception e) {

27. e.printStackTrace();

28. }

29. }

30. }

31. }

Yukarıda basit bir dosya okuma işlemi görüntülenmektedir. Burada fileWriter değişkeni bir dosyaya

erişim açar ve write komutu ile str değişkeni dosyanın içerisine yazılır. write komutu diske yazma

yapamaması durumunda bir IOException (Input Output - Giriş Çıkış) hatası fırlatır ve biz de

bunu catch bloğu içerisinde yakalarız.

Not: printStackTrace metodu hatanın detaylı bir şekilde konsola yazılmasını sağlar.

catch bloğu içerisinde yazma işlemi gerçekleşmese bile dosya ile erişimin devam etmesi ihtimali

programımızın ciddi bir soruna yola açmasını sağlayabilir. Bu yüzden dosya yazma işlemi olmasa

da bizim dosya bağlantısını mutlaka kapatmamız gerekir. İşte bu yüzden finally bloğu

içerisinde close metodunu çalıştırırız ve eğer yazma işlemi gerçekleşmese de dosya ile bağlantıyı

kesmiş oluruz. Burada null kontrolü yapılmasının sebebi fileWriter değişkeninin null olabilme

ihtimalidir.

Not: Dosya yazma ile ilgili geniş bilgi bir sonraki bölümde anlatılacaktır.

Kendi hatalarımızı oluşturma

Program içerisinde kendi hazırladığımız sınıf ve metodlar zaman zaman bize özgü hatalar

fırlatabilirler. Bunu sağlamak için kendimize ait bir hata sınıfı oluşturabiliriz. Java Exception sınıfı

extend edilebilir bir sınıf olduğundan aşağıdaki gibi bir hata sınıfı hazırlanabilir:

1. package com.turkcell.and101;

2.

Page 49: Android'e Giriş Eğitimleri 1_2

48

3. public class OzelException extends Exception {

4. private static final long serialVersionUID = 1L;

5.

6. @Override

7. public String getMessage() {

8. return "Benim hatam olustu.";

9. }

10. }

Yukarıdaki örnekte MyException adında bir hata sınıfı oluşturduk ve getMessage metodunu

değiştirdik. Şimdi bu hatayı fırlatan bir metod hazırlayalım ve uygulamada bu hatayı yakalayalım:

1. package com.turkcell.and101;

2.

3. public class ExceptionOrnek2 {

4. public static void main(String[] args) {

5. try {

6. hataFirlatir();

7. }

8. catch (OzelException e) {

9. System.out.println(e.getMessage());

10. }

11. }

12.

13. public static void hataFirlatir() throws OzelException {

14. throw new OzelException();

15. }

16. }

Hazırladığımız hataFirlatir adlı metod az önce

oluşturduğumuz OzelException hatasını throw komutuyla ile fırlatıyor. Derleyici ise bu metodun bir

hata fırlattığını throw sözcüğüyle anlıyor. main metodu

içindehataFirlatir çağırıldığında OzelException hatasının mutlaka yakalanması gerekiyor

ve getMessagemetodu konsola “Benim hatam oluştu” mesajını veriyor.

Profesyonel uygulamaların çoğunda, hazırlanan servisler kullanılırken bir hata oluştuğunda bunu

diğer sınıflara belirtmek için özel hata sınıfları hazırlanır. Bu konuya diğer bölümlerde tekrar

değineceğiz.

Page 50: Android'e Giriş Eğitimleri 1_2

49

14.JAVA'DA DOSYA İŞLEMLERİ

Bu bölümde sizlere Java'da bir dosyaya veri yazmayı ve ardından okumayı göstereceğiz. İlk

örneğimizde bir string değişkeni içerisinde saklanan veriyi disk üzerinde bir .txt (metin) dosyasına

yazmayı anlatacağız.

1. String str = "Bunu dosyaya yazdir";

2.

3. File file = new File("dosya.txt");

4. if (!file.exists()) {

5. file.createNewFile();

6. }

7.

8. FileWriter fileWriter = new FileWriter(file, false);

9. BufferedWriter bWriter = new BufferedWriter(fileWriter);

10. bWriter.write(str);

11. bWriter.close();

Java'da disk üzerindeki dosyalar ve klasörlerle iletişim sağlamak için File sınıfından faydalanırız.

File sınıfı disk üzerinde belirtilen konumdaki bir dosya ya da klasörü kod içerisinden tanımlamak için

kullanılır. Yukarıdaki kod parçasına bakarsak File sınıfının yapıcısı (Constructor) içerisinde dosyanın

adı dosya.txtolarak belirtilmiş. Bu şekilde disk üzerinde dosya.txt adında bir dosyaya işlem yapmak

için o dosyayı bir değişkene atamış oluyoruz. exists metodu dosyanın disk üzerinde önceden var

olduğunu kontrol etmek için kullanılıyor. Eğer dosya diskte henüz yoksa createNewFile ile

diskte dosya.txt adında bir dosya oluşturuyoruz.

Dosyaya metin yazma işlemini başlatmak için FileWriter sınıfından faydalanırız. FileWriter sınıfı File

tipindeki bir değişkeni yazma amacıyla kullanmaya yarar. Yapıcı içerisinde yer alan boolean

tipindeki değer dosyanınappend modunda yazılmasını sağlar. append modu dosyanın içerisinde

yer alan mevcut metinlere dokunmadan dosyanın son karakterinden itibaren yazma işlemini

başlatacaktır. Yukarıdaki kod içerisinde bu değer false olduğundan dosya.txt her seferinde baştan

yazılacaktır.

BufferedWriter sınıfı ise dosyaya bir kayıt yazarken bize ayarlanabilir bir tampon bellek (Buffer)

sunacaktır. Bu işlem olmadan yazma işlemi yapılması karakterlerin anında byte'a dönüştürülüp

dosyaya yazılmasına yol açacak ve programın verimsiz çalışmasına yol açacaktır (Bkz: Buradaki

belge).

write metodu yazma işlemini başlatır. Dosyaya yazma işlemimiz tamamlandıktan

sonra close komutuyla dosya ile olan işlemi tamamlarız ve diskte metin dosyamız oluşur.

Page 51: Android'e Giriş Eğitimleri 1_2

50

Dosyayı okumak içinse aşağıdaki kodu kullanırız:

1. FileReader fileReader = new FileReader(file);

2. String line;

3.

4. BufferedReader br = new BufferedReader(fileReader);

5.

6. while ((line = br.readLine()) != null) {

7.

8. System.out.println(line);

9.

10. }

11.

12. br.close();

Buradaki file değişkeni bir önceki örnekte oluşturulan File sınıfındaki değişkendir

ve dosya.txt adındaki dosyamızı belirtir. Burada dosyayı okuma amacıyla FileReader adındaki sınıfı

kullanmamız gerekir. Daha önceki örnekte olduğu gibi BufferedReader yardımıyla dosyamızı

okumaya başlarız. Dosya içerisindeki her satır line adındaki bir değişkene atılır ve dosyanın sonuna

gelene kadar bütün satırlar konsola yazdırılır (line != null). İşlem bitirildikten sonra

Page 52: Android'e Giriş Eğitimleri 1_2

51

BufferedReader close metoduyla kapatılır.

Not: BufferedReader bize yüksek bir tampon bellek sağlar. BufferedReader

kullanılmazsa read metodu her çağırıldığında dosyadan byte'lar çekilir, karakterlere dönüştürülür ve

döndürülür. Bu da programın performansının düşmesine yol açar. (Bkz: Buradaki kılavuz belge)

Eğer bir resmi ya da İnternet üzerinden çektiğimiz bir dosyayı diske kayıt etmek istiyorsak, metin

dosyası yerine binary dosya kullanmamız gerekir. Java bu amaçla aşağıdaki sınıfları sunmaktadır:

1. byte[] data = {0x01, 0x02};

2.

3. File binaryFile = new File("binary.dat");

4. FileOutputStream fos = new FileOutputStream(binaryFile);

5. BufferedOutputStream bos = new BufferedOutputStream(fos);

6. bos.write(data);

7. bos.close();

FileOutputStream binary bir dosyaya byte tipinde bir değişken yazmak için kullanılır. Yukarıdaki

örnektedata değişkenindeki byte değerleri binary.dat adında bir dosyaya yazılmak için

hazırlanmıştır. BufferedOutputStream ise binary dosyaya yazma işlemi sırasında bize tampon bellek

sağlar. writekomutuyla yazma işlemi tamamlandıktan sonra close metodu ile akış (stream)

kapatılmalıdır.

Dosyayı okumak içinse aşağıdaki koddan faydalanırız:

1. data = new byte[(int) binaryFile.length()];

2. FileInputStream fis = new FileInputStream(binaryFile);

3. BufferedInputStream bis = new BufferedInputStream(fis);

4. bis.read(data, 0, data.length);

5. bis.close();

Page 53: Android'e Giriş Eğitimleri 1_2

52

Yukarıda öncelikle dosyanın içeriğini alabileceğimiz bir byte dizisi oluşturuyoruz. Bu dizi binary

dosya için dosyanın boyutu kadardır ve File sınıfında bulunan length metoduyla öğrenilebilir.

Ardından oluşturulan FileInputStream akışı ile dosyaya erişim sağlanır ve BufferedInputStream

yardımıyla dosya okunarak içerisindeki bütün byte değerleri data değişkenine aktarılır. Bu noktadan

sonra dosyanın tüm içeriği datadizisi içinde yer alır. close metodu akışı kapatmak için kullanılır.

Android uygulamalarında SD kart üzerine veri yazmak ya da uzaktaki bir kaynaktan alınan resimleri

saklamak için bu metodları sıklıkla kullanacağız.

14.1.Dosyalara Bilgi Kaydı

GİRİŞ-ÇIKIŞ AKIMLARI

Java’da Giriş-Çıkış akımları, iki ana gruba ayrılır:

1. Karakter kökenli akımlar

2. Byte kökenli akımlar

Bunların herbiri için ayrı sınıflar tanımlanmıştır. Aşağıdaki şekil bu konuda bize fikir veriyor:

Karakter Kökenli Akımlar

Bu bölümde önce karakter kökenli akımlar ile bellek üzerindeki dosyalara bilgi kaydını gözden

geçireceğiz. Bellek üzerine karakter türü bilgi kaydını Writer sınıfının alt sınıflarını kullanarak

gerçekleştiriyoruz. Aşağıda, Writer sınıfıyla ilişkili sınıf hiyerarşisini görüyoruz:

Page 54: Android'e Giriş Eğitimleri 1_2

53

FileWriter Sınıfının Kullanımı

Aşağıdaki örnek Java programı, FileWriter sınıfından yazar adlı bir nesne oluşturarak, bu nesne

yardımıylasiir.txt adlı text tipi dosyaya bilgi kaydediyor. Dosyaya bir satırlık bilgi write metoduyla

yazılıyor ve satır sonu ‘\n’ karakteriyle belirleniyor.

1. import java.io.FileWriter;

2. import java.io.IOException;

3.

4. public class TextDosyaYaz {

5. public static void main(String[] args) throws IOException {

6. String dosyaAdi = "siir.txt";

7. FileWriter yazar = new FileWriter(dosyaAdi);

8. yazar.write("coklarindan dusuyor da bunca\n");

9. yazar.write("gormuyor gelip gecenler\n");

10. yazar.write("egilip aliyorum\n");

11. yazar.write("solgun bir gul oluyor dokununca - behcet necatigil\n");

12. yazar.close();

13. }

14. }

Uygulamayı Eclipse ile çalıştırdığımızda projenin bulunduğu dizinde bir siir.txt dosyasının

oluşturulduğunu görürüz:

Page 55: Android'e Giriş Eğitimleri 1_2

54

Dosyayı açtığımızdaysa aşağıdaki içeriği görürüz:

Metin türünde bir dosyanın içeriğinin herhangi bir metin düzenleyici program

yardımıyla görüntülenebileceğini belirtmiştik. Burada bunun örneğini görmüş olduk. siir.txt adlı

dosyanın içeriğini bir Java programıyla da görüntüleyebiliriz. Bunun örneğini de biraz sonra

göreceğiz. Ancak, bytetipi ya da ikili(binary) dosyaların içeriği sadece Java programı yardımıyla

görüntülenebilir.

Metin Türü Dosyadan Bilgi Okumak

Metin türü bir dosyadan bilgi okumak için Reader sınıfını ve alt sınıflarını kullanırız. Aşağıda Reader

sınıfı ve ilgili sınıfların hiyerarşisini görüyoruz:

Page 56: Android'e Giriş Eğitimleri 1_2

55

FileReader sınıfı sayesinde disk üzerindeki metin tipi dosyadan alınan karakterler, bellek

içinde char tipine dönüştürülür. Eğer UTF formatıyla desteklenen, İngiliz alfabesi dışındaki

karakterler kullanılmışsa bir karakter 3 byte’lık yer kaplamış olabilir.

Diskten okunan verilerin önce bellekte bir tampon alan(buffer) içine yerleştirilmesi genellikle daha

etkin bir yöntemdir. BufferedReader sınıfı bu amaçla kullanılır.

Örnek Java Programı: Filereader Ve Bufferedreader İle Okuma

Bir önceki örnekte siir.txt adı ile oluşturduğumuz dosyayı şimdi bir Java programı ile okuyarak

ekrana aktaracağız:

1. import java.io.BufferedReader;

2. import java.io.FileReader;

3. import java.io.IOException;

4.

5. public class TextDosyaOku {

6. public static void main (String[] args){

7. String dosyaAdi = "siir.txt";

8. String satir;

9. try{

10. BufferedReader oku = new BufferedReader(new FileReader(dosyaAdi));

11. satir = oku.readLine();

12. while (satir != null) {

13. System.out.println(satir);

14. satir = oku.readLine();

15. }

16. oku.close();

17. }

Page 57: Android'e Giriş Eğitimleri 1_2

56

18. catch (IOException iox){

19. System.out.println(dosyaAdi+" adli dosya okunamiyor.");

20. }

21. }

22. }

Aşağıda olduğu gibi, siir.txt adlı metin dosyasının içeriğinin listelendiğini görürüz:

Örnek Uygulama: Bir Metin Dosyasının İçeriğini Diğer Bir Metin Dosyasına Kopyalama

Aşağıdaki Java programı ile komut satırından adı girilen bir dosyanın içeriği yine komut satırından

adı belirtilen diğer bir dosyaya kopyalanabiliyor. Aşağıdaki adımları izleyelim:

1. Aşağıdaki Java program bloğunu yazalım:

1. import java.io.BufferedReader;

2. import java.io.BufferedWriter;

3. import java.io.FileReader;

4. import java.io.FileWriter;

5. import java.io.IOException;

6.

7. public class Kopyala{

8. String kaynakDosyaAdi, hedefDosyaAdi;

9. BufferedReader kaynakBuffer;

10. BufferedWriter hedefBuffer;

11. String satir;

12.

13. public static void main (String[] args) {

14. if (args.length == 3 &amp;&amp; args[1].toUpperCase().equals("TO")) {

15. new Kopyala().kopya(args[0], args[2]);

16. }

17. else {

18. System.out.println("Kullanim sekli: ");

19. System.out.println("java Kopyala &lt;dosya1&gt; to &lt;dosya2&gt;");

20. }

21. }

22.

Page 58: Android'e Giriş Eğitimleri 1_2

57

23. public boolean kopya(String isim1, String isim2) {

24. kaynakDosyaAdi=isim1;

25. hedefDosyaAdi=isim2;

26. return dosyayiAc() &amp;&amp; dosyayiKopyala() &amp;&amp; dosyayiKapat();

27. }

28.

29. private boolean dosyayiAc() {

30. // Kaynak dosyayı aç

31. try {

32. kaynakBuffer = new BufferedReader(

33. new FileReader(kaynakDosyaAdi));

34. }

35. catch (IOException e) {

36. System.out.println(kaynakDosyaAdi

37. +" dosyasinin acilisinda sorun var!");

38. return false;

39. }

40.

41. // Hedef dosyayı aç

42. try {

43. hedefBuffer = new BufferedWriter(

44. new FileWriter(hedefDosyaAdi));

45. }

46. catch (IOException e) {

47. System.out.println(hedefDosyaAdi

48. +" dosyasinin acilisinda sorun var!");

49. return false;

50. }

51. return true; //iki dosya da ulasilabilirse true döndürür

52. }

53.

54. private boolean dosyayiKopyala() {

55. //esas metodumuz

56. try {

57. satir = kaynakBuffer.readLine();

58. while (satir != null) {

59. hedefBuffer.write(satir);

Page 59: Android'e Giriş Eğitimleri 1_2

58

60. hedefBuffer.newLine();

61. satir = kaynakBuffer.readLine();

62. }

63. }

64. catch (IOException e) {

65. System.out.println("Kopyalama yapilamiyor.");

66. return false;

67. }

68. return true;

69. }

70.

71. private boolean dosyayiKapat() {

72. boolean sorunsuzMu=true;

73. // kaynağı kapat

74. try {

75. kaynakBuffer.close();

76. }

77. catch (IOException e) {

78. System.out.println(kaynakDosyaAdi+" dosyasinin kapanisinda hata!");

79. sorunsuzMu = false;

80. }

81. // hedefi kapat

82. try {

83. hedefBuffer.close();

84. }

85. catch (IOException e) {

86. System.out.println(hedefDosyaAdi+" dosyasinin kapanisinda hata!");

87. sorunsuzMu = false;

88. }

89. return sorunsuzMu;

90. }

91. }

2. Komut satırından aşağıdaki komutu girelim:

Böylece siir.txt adlı dosyanın içeriği aynen manzum.txt adlı metin dosyasına kopyalanır.

Page 60: Android'e Giriş Eğitimleri 1_2

59

İkili (Bınary) Dosyalar

Metin tipi dosyalarda, her byte veya byte ikilisi bir ASCII kodu şeklinde yorumlanırken, ikili

dosyalarda değişik uzunluklardaki byte grupları farklı türlerdeki veri olarak yorumlanır. Bu yorum

yazılım tarafından gerçekleştirilir. Örneğin, bir Java binary dosyasında, bir int türü veri 4 byte’lık bir

veri grubuyla saklanır.

İkili (binary) dosyaya veri kaydetmek için temel sınıf OutputStream sınıfıdır. Aşağıdaki şekilde bu

sınıf ve alt sınıflarını görüyoruz:

Aşağıdaki kod örneği ikili dosyaların birbirine kopyalanmasını gösterir.

1. import java.io.FileInputStream;

2. import java.io.FileOutputStream;

3. import java.io.IOException;

4.

5. public class IkiliDosya {

6.

7. public static void main(String[] args) {

8.

9. //Dosyalarınızın yolunu belirtin.

10. String kaynakDosya = "Kaynak dosyanın yolu";

11. String hedefDosya = "Hedef dosyanın yolu";

12.

Page 61: Android'e Giriş Eğitimleri 1_2

60

13. try {

14. //Kopyalama işlemi için InputStream ve OutputStream nesnelerinizi oluşturun.

15. FileInputStream fis = new FileInputStream(kaynakDosya);

16. FileOutputStream fos = new FileOutputStream(hedefDosya);

17.

18. //Kopyalanacak satırın ilk harfinin yerini belirtin.

19. int offset = 0;

20. //Kopyalanacak satirin boyutunu tanımlayın.

21. int satirinboyutu = 0;

22. //Kopyalanacak satır için array oluşturun.

23. byte[] satir = new byte[1024];

24.

25. //İlk satırı okuyup boyutunu alın.

26. satirinboyutu = fis.read(satir);

27.

28. //Okunan satırların boyutu -1 değilse, yani sona gelinmediyse kopyalayın.

29. while (satirinboyutu != -1) {

30. //Hedef dosyaya yazın.

31. fos.write(satir, offset, satirinboyutu);

32. //Yeni bir satır okuyun.

33. satirinboyutu = fis.read(satir);

34. }

35.

36. //Her iki dosyayı da kapatın.

37. fis.close();

38. fos.close();

39.

40. }

41. catch (IOException e) {

42. //Bir hata durumunda programınıza uyarı verdirin.

43. System.out.println("Bir hata oluştu " + e);

44. }

45. }

46. }

Page 62: Android'e Giriş Eğitimleri 1_2

61

15.NESNE YÖNELİMLİ PROGRAMLAMA

Nesne Yönelimli Programlama, 1990’lı yıllarda başlayan ve günümüzde de yoğun olarak kullanılan

bir programlama teknolojisidir.

Nesne Yönelimli Programlama'da, programlama ortamındaki her şey bir nesne olarak kabul edilir

ve nesnelerin özellikleri değiştirilerek onlara yeni biçimler verilebilir. Ayrıca her nesnenin duyarlı

olduğu durumlar da mevcuttur. Her nesne üzerine uygulanabilecek farklı metotlar

oluşturulmuştur. Yapısal Programlama'da ağırlık programlama komutlarındayken, Nesne Yönelimli

Programlama'da yazılımcının ortamdaki nesneler, bunların özellikleri, duyarlı oldukları olaylar ve

nesnelere uygulanabilecek metotlar hakkında ayrıntılı bilgi sahibi olması gerekir.

1990’ların başında, özellikle İnternet uygulamalarına yönelik özellikleriyle öne çıkan Java dili saf

(pure) bir nesneye yönelik programlama dilidir.

Nesne Yönelimli Programlama dillerinin teknik özelliklerini gözden geçirmeden önce, yukarıda

belirtilen nesne yönelimli dillerin oluşturulma nedenlerini anlayabilmek için Nesne Yönelimli

Programlama dillerinin yararlı yönlerini gözden geçirelim.

Yazılımın Bakım (Maintenance) Kolaylığı

Nesne Yönelimli Programlama dillerinde, nesneler ait oldukları sınıfların sunduğu şablonlarla temsil

edilirler. Birbirinin benzeri ya da aynı konu ile ilişkili sınıflar bir araya getirilerek namespace ya

da package (paket) adı verilen sınıf kümeleri oluşturulur. Bu durumda yazılımın bakımı demek; ya

mevcut sınıflarda değişiklik ya da yeni sınıf eklenmesi anlamına gelir. Bu da yazılımın tümünü hiçbir

şekilde etkilemeyecek olan bir işlemdir. Oysa klasik yapısal programlama dilleriyle geliştirilen

programlarda yazılımın bakım maliyeti üretim maliyetinin çok önemli bir yüzdesi kadardır (%40’lar

civarında).

Genişletilebilirlik (Extensibility)

Nesne Yönelimli Programlama'da mevcut bir sınıfa yeni özellik ve metotlar ekleyerek artan işlevsellik

sağlamak oldukça kolaydır.

Üretilen Kodun Yeniden Kullanılabilirliği (Reusability)

Nesnelerin üretildiği sınıflar, ortam içinde her uygulama geliştiricinin kullanımına açık olduğu için

ortak bir kütüphane oluşturulmuştur. Her kullanıcı bu ortak kütüphanede bulunan sınıfları kullanarak

gerekli kodu yeniden yazmaktan kurtulur ve uygulamaya özgü kod parçaları, ortak kullanımdaki

sınıfların kod uzunluklarına göre göz ardı edilebilir boyuttadır.

15.1.Nesne Ve Nesne Yönelimli Programlama Teorisinin 4 Temel Özelliği

Nesne Nedir?

Nesne, içinde veri ve bu veriler üzerinde işlem yapacak olan metotları (fonksiyon) bulunduran

yazılım bileşenidir. Nesne bu tanıma uygun olarak, kendi işlevselliğini de içinde taşır. Nesneler her

uygulamada tekrar tekrar kullanılabilir. Veri ve metotlar, birlikte nesnenin üyeleri (members) adını

Page 63: Android'e Giriş Eğitimleri 1_2

62

alır. Bir nesne yapısı, bir sınıf (class) içinde tanımlanır. Sınıf içinde nesneyi oluşturan üye

değişkenler ve metotlar açıkça tanımlanır.

Nesne Yönelimli Programlama Teorisi'nde 4 temel özelliğin gerçekleştirilmesi zorunlu sayılmıştır ve

bu temel özelliklerden birini bile sağlamayan bir dil saf (pure) Nesne Yönelimli Programlama Dili

sayılmaz.

Bu 4 temel özellik;

1. Soyutlama (Abstraction)

Soyutlama denilince, nesneyi bazı karakteristikleri olan ve bazı eylemleri gerçekleştirebilen bir veri

tipi olarak genelleştirmek anlaşılmalıdır. Yeryüzü üzerinde bulunan her şey bir nesnedir. Bilgisayar

yazılımı açısından nesne, bir varlığın temsil biçimidir. Örneğin; bina bir nesnedir. Binayı bilgisayar

yazılımı içinde temsil etmek istersek, öncelikle bu nesnenin yani binanın ayırt edici özelliklerini

belirlemeliyiz.

Örneğin;

Bina yüksekliği

Dış yüzey rengi

Kat sayısı

Zemin alanı

Zemin boyutları

gibi özellikler, binayı temsil etmek için ilk akla gelen birkaç özelliktir. O halde nesnenin bilgisayarda

temsilinde, özellikleri kilit rol oynamaktadır.

Nesnenin karakteristikleri, özellikler ve gerçekleştirebileceği eylemler de metot adını alır. Bu

anlamda, soyutlaştırmanın sonucunda bir nesne;

Özellikleri (properties, member variables - Objective-C)

Metotları (methods) ile temsil edilebilir.

Nesne Yönelimli Programlama Dilleri, soyutlamayı sınıf (Class) yapısı ile gerçekleştirirler. Sınıf

yapısı içinde o nesneye ait özellikler ve metotlar tanımlanabilir.

Ancak sınıf soyut bir yapıdır ve doğrudan kullanılamaz. O sınıftan üretilen örnekler sınıfa ait tüm

özelliklere ve metotlara sahip olurlar. Bunlar program içinde doğrudan kullanılabilirler. Sınıftan

üretilen her örnek, aynı özellik ve metotlara sahip olacak ancak özelliklerin değerleri doğal olarak

farklı olabilecektir.

Page 64: Android'e Giriş Eğitimleri 1_2

63

Örneğin, insanı bir nesne olarak düşünürsek ve insan sınıfı olarak soyutlarsak, ilk akla gelen

özellikleri; boy, kilo, IQ ve EQ değerleri, eğitim düzeyi vb. gibi özellikler olur. Bu özelliklerin

değerleri doğal olarak her insan için farklıdır. İnsan için ilk akla gelen eylemler (metotlar) ise;

yürüme, okuma-yazma, konuşma, araç kullanma vb. gibi metotlardır.

2. Sarmalama / Paketleme (Encapsulation)

Paketlemenin anlamı; sınıfı oluşturan metot ve özelliklerin gerçekleştirme biçiminin, bu sınıfı

kullanacak olan kullanıcılardan gizlenmiş olmasıdır.

NESNE = VERİ + METODLAR

şeklinde ifade edilen bağıntı aslında Nesne Yönelimli Programlama'nın temelini açıklamaktadır. Veri

(özellikler) ve veri üzerinde işlem yapan kod (metotlar) bir arada bulunur ve nesneyi oluşturur.

Nesneyi tanımlayan sınıfın iç ayrıntıları, normal olarak programın artakalan kısmı için görünür

değildir.

Bir nesne sınıfının gerçekleştirimini değiştirirsek, yani aynı sınıfı metot ve özellikleri aynı kalmak

koşuluyla farklı bir programlama tekniğiyle oluşturursak, o sınıfın dış dünyaya olan arayüzü

değişmediği sürece (metot ve özellikler aynı kaldığı sürece) bu sınıfı kullanan program kodlarınızda

bir değişiklik yapmamıza gerek kalmayacaktır.

3. Miras Alma (Inheritance)

Nesneye yönelik programlamada, bir nesne, genellikle bir nesne sınıfına ait bir örnektir (instance).

Örneğin, Albert Einstein, insan sınıfının bir örneğidir. Bir nesne sınıfından alt sınıflar (subclasses)

oluşturulabiliyorsa, türetme özelliği (derivation) var demektir. Örneğin insan sınıfı, canlı sınıfının bir

alt sınıfıdır.

Kendisinden alt sınıf üretilen sınıfa, temel sınıf (base class) veya süper sınıf (super class) veya

ana sınıf (parent class) adı verilir.

Subclass yerine child class terimi de kullanılmaktadır.

Alt sınıfın nesneleri, türetildikleri temel sınıfa ait özellikleri alıyorsa, burada miras alma (inheritance)

özelliği vardır denir.

Bu anlamda, miras alma özellikli bir nesne yönelimli programlama dilinde, bir nesne sınıfından

türetilen alt nesne sınıfına ait nesneler, üst sınıfın özelliklerini (properties) ve metodlarını (methods)

aynen alırlar.

Page 65: Android'e Giriş Eğitimleri 1_2

64

4. Çok Biçimlilik (Polymorphism)

Farklı nesnelerin, aynı mesaja (olaya ya da uyarıma) farklı şekillerde cevap verebilme yeteneğidir.

Her nesne sınıfı, kendi metotlarını paketlediği için ve bu metotlar programın kalan kısmı için gizli

olduğundan, farklı sınıflar aynı isimde bazı metotlara sahip olabilirler.

Örneğin ŞEKİL adlı bir süper sınıfımız (super class) olsun. Bu sınıftan, DAİRE,

KARE ve ÜÇGEN adlı 3 alt sınıf türettiğimizi varsayalım. Bu alt sınıfların her biri kendi örneklerini

çizmek için ÇİZ adlı bir metoda sahip olabilir. Fakat, her bir alt sınıf için bu metot aynı olmasına

karşın, bu metodu devreye sokmak için gönderilecek mesajdan sonra her alt sınıfa ait nesne farklı

bir şekil (yani kendini, yani bir üçgen, daire veya kare) çizecektir.

Nesne Yönelimli Programlamanın sınıf türetebilme özelliği sayesinde, bir nesne hiyerarşisi

oluşturma imkânı bulunnmaktadır.

15.2.Java'da Sınıf Oluşturma

Sınıf (class) yapısının bu sınıftan üretilecek nesneler için bir şablon görevi gördüğünü söyleyebiliriz.

Nesneleri oluşturmanın ilk adımı, o nesnenin özelliklerini ve eylemlerini belirleyen sınıf yapısını

tanımlamaktır. Java'da sınıf yapısı,

1. class&nbsp;Sınıfİsmi<br />

2. &nbsp;&nbsp;&nbsp;&nbsp;{<br />

3. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Özellik&nbsp;Tanımları;<br />

4. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Metod&nbsp;Tanımları;<br />

5. &nbsp;&nbsp;&nbsp;&nbsp;}

şeklinde oluşturulur.

Page 66: Android'e Giriş Eğitimleri 1_2

65

Sınıf içinde özellik tanımlamak için değişkenler, metot tanımlamak için de çeşitli yordamlar

bulunabilir.

ÖRNEK:

Aşağıdaki Daire adlı sınıf, Yaricap adlı bir özelliği ve Alan ile Cevre adlı iki metodu ile gösterilmiştir:

Bu sınıfı oluşturmak için Java'da aşağıdaki kod yazılabilir:

1. class Daire<br />

2. {<br />

3. &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;double yariCap;<br />

4. &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;double alan()<br />

5. &nbsp;&nbsp;&nbsp;&nbsp;{<br />

6. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;3.14159&nbsp;*

yariCap * yariCap;<br />

7. &nbsp;&nbsp;&nbsp;&nbsp;}<br />

8. &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;double cevre()<br />

9. &nbsp;&nbsp;&nbsp;&nbsp;{<br />

10.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;2&nbsp;*&nbsp;3.141

59&nbsp;*&nbsp;yariCap;<br />

11. &nbsp;&nbsp;&nbsp;&nbsp;}<br />

12. }

Sınıftan Nesne Oluşturma

Sınıf yapısının bu sınıftan üretilecek nesneler için bir şablon görevi gördüğünü söyleyebiliriz.

Yukarda tanımladığımız Daire adlı sınıftan d adlı bir nesne oluşturmak için,

Daire&nbsp;d = new Daire();

şeklinde bir ifade kullanmamız gerekir.

Page 67: Android'e Giriş Eğitimleri 1_2

66

d, artık daire sınıfından bir nesne olduğu için bu sınıfın metotlarını kullanabilir. Metotları çağırmak

için,

d.cevre();

d.alan();

ifadelerini kullanırız.

Aynı şekilde özelliklere erişmek için de "." sembolünü kullanırız:

d.yariCap;

Örnek Uygulama: Sınıf Tanımlama Ve Sınıftan Nesne Türetme

I. Bir yarıçap bilgisinden faydalanarak dairenin çevresini ve alanını bulan örneği yazalım. Bunun için

aşağıdaki Java kodunu yazınız:

II. Programı çalıştırdığınızda önce yarıçap sorulacak ve bu veri girilince çevre ve alan hesaplanıp

ekrana basılacaktır:

1. //Dosya Adı: Main.java

2.

3. package com.turkcell.and101;

4.

5. import java.util.Scanner;

6.

7. public class Main {

8. public static void main(String[] args) {

9. Scanner giris=new Scanner(System.in);

10. double yariCap=giris.nextDouble();

11.

12. Daire daire=new Daire();

13. daire.yariCap=yariCap=yariCap;

14.

15. System.out.println(daire.alan());

16. }

17. }

Page 68: Android'e Giriş Eğitimleri 1_2

67

16.ALGORİTMAYA GİRİŞ

Herhangi bir programlama dilini öğrenmeye başlamadan önce algoritma kavramını anlamanın çok

önemli olduğunu düşünüyoruz. Algoritma, belirli bir işi yapmak için izlenen yol anlamındadır.

Matematik ve bilgisayar programlamada sıkça kullanılır. Programlamaya başlamadan önce

problemin çözümü bulunmalı ve çözüme giden yollar oluşturularak en verimli şekilde

sonuçlandırılmalıdır. Çözüme giden bu yolların bulunması içinde sistematik düşüncenin

geliştirilmesi gerekir. Algoritma oluşturulurken dikkat edilmesi gereken en önemli nokta ise,

hesaplanabilir tüm ihtimalleri ve onların çözüm yollarını bulabilmektir. Bir çözüm yolundaki tüm

ayrımlar düşünülmeli bu durumlarda ne yapılacağı belirlenmelidir. Teorik olarak anlatıldığında

anlaşılması zor bir kavram olan algoritmayı örneklerle açıklamaya çalışalım.

Örnek Durum:

İlk örneğimiz bilgisayarı çalıştırıp, gelecegiyazanlar portalına girmek olsun. Bunun için yapılması

gereken ilk şey bilgisayarın açık olup olmadığı durumuna bakmaktır. Aşağıda çözümün flowchartını

(işleyiş şemasını) görmektesiniz.

Bilgisayar programlamada da benzer mantıkla algoritmalar oluşturulur. Önce çözüm yolları

düşünülerek en makul çözüm bulunur. Ardından bu çözüm programlama dillerinden uygun olanları

ile kodlanarak program, web sitesi, uygulama haline getirilir. Aşağıdaki örnek duruma bakıldığında

bilgisayar mantığını biraz iyi daha anlayabiliriz.

Page 69: Android'e Giriş Eğitimleri 1_2

68

Örnek Durum:

Başlangıç olarak ağırlıklarını bilmediğimiz 2 torbanın arasında bir ağırlık kontrolü yapalım.

Torbalarımızdan biri X diğeri Y olsun. Bu torbaları karşılaştırıp karar vermeliyiz. Bunun için eşit kollu

bir terazi kullanmamız gerekmektedir. Bu terazinin bir koluna X diğer koluna Y torbalarını yerleştirip

sonucu gözlemleyebiliriz. Eğer bir kol aşağıya inmişse X torbası daha ağırdır ya da ilk kol yukarıya

çıkmışsa Y torbası daha ağırdır. Şimdi bunun programlamadaki yerine bakalım.

Burada X ve Y bizim değişkenlerimizdir, terazimiz ise bilgisayarımızdır. Terazinin kollarının verdiği

tepkiler ise bilgisayarın bize verdiği cevaplardır.

Günümüz dünyasında bilgisayar programcılığı için en önemli şey, problemlere karşı üretilen

algoritmalardır. Bir programcının algoritma kurma becerisi, onun yazacağı programların kalitesi ve

optimizasyonu açısından çok önemlidir. Çünkü bu iki kavram, günümüz programcılığının en büyük

handikaplarındandır.

Şimdi faktoriyel hesabının bilgisayar tarafından nasıl yapıldığını inceleyelim. Bilindiği üzere n!(n

faktoriyel) ifadesi n*(n-1)*(n-2)*(n-3)...*2*1 ifadesine eşittir. bu bilgiler ışığında kullanıcıdan alınan n

sayısının faktoriyel hesabını bulalım.

Page 70: Android'e Giriş Eğitimleri 1_2

69

Örnek Durum:

Bir örnekte fibonacci sayılarının hesabıyla ilgili olsun. Bunu yaparken dizileri kullanalım ki,

çözümümüz her çağrıldığında işlemler tekrarlanmasın ve daha hızlı bir çözüm üretilebilsin.

Fibonacci sayıları; kendisinden önceki iki sayının toplamı şeklinde gider. Yani fibonacci serisi: 0, 1,

1, 2, 3, 5, 8, 13, 21, 34 ... şeklindedir. Şimdi kullanıcının bize n. fibonacci sayısını sorduğunu

varsayalım.

Algoritmamız aşağıdaki gibi olacaktır.

Bu noktadan sonra örneklerimizin karmaşıklık seviyesini biraz daha arttıralım ve akış diyagramları

yerine kod tasarımları ile devam edelim.

Page 71: Android'e Giriş Eğitimleri 1_2

70

Örnek Durum:

Bilgisayar programcılığında kullanılan alan ve zaman arasında bir ters orantı vardır ve imkanlar

sınırlıdır. Örneklemek gerekirse, yazacağınız bir uygulamada kullanıcının alacağı tepki süresinin

uzun olmasını kabullenip, telefonun hafızasını daha az kullanmasını isteyebilirsiniz. Tabii ki bunun

tam terside düşünülebilir fakat programın algoritması kurulurken gereksinimler ve sınırlamalar (alan

ve tepki süresi gibi) göz önüne alınarak hazırlanmalı maksimum seviyede fayda kazanılmaya

çalışmalıdır.

Anlatılanların daha iyi kavranılması için bir yer değiştirme örneği üzerinden ilerleyelim. Burada iki

değişken ifadenin yerlerini değiştirme örneğini üzerinden gidelim.

Problemimiz x=a , y=b ifadesini y=a , x=b şekline çevirmek olsun.

Bu örnekte alan kullanımının sınırsız olduğunu varsayarak yaptığımız çözümdür.

x = a;

y = b;

temp=x; //x'in içindeki sayıyı kaybetmemek için boş bir alan yaratıp onu buraya kopyalıyoruz.

x=y; //x in kopyası olduğu için artık x'in üzerine y'yi yazabiliriz.

y=temp; //y değerinin üzerine temp değişkenini atayarak artık x=b, y=a çözümünü sağlamış olduk.

Aynı örneği alan sınırlaması olduğunu fazladan alan kullanmadan çözeceğimizi düşünerek

deneyelim bu sefer.

x=a;

y=b;

x=x+y; //alanımızın sınırlı oldugunu varsayalım. x'i a+b ifadesine eşitleyelim.

y=x-y; //bu durumda y=a+b-b olacaktır.

x=x-y; //son olarak x=a+b-a olacak ve çözüme ulaşmış olacağız. Fazla alan kullanmadan da çözmüş

olduk.

Örnek Durum:

Şimdi çok basit gibi gözüken fakat çözümü çok kolay olmayan başka bir örneğe geçelim. Örneğimiz,

*'lar kullanarak bir eşkenar dörtgen çizdirmek olsun. Bunu belirli bir boyutta değil dinamik yapıda

yapmak istiyoruz. Bunun içinde kullanıcıdan merkez satırınındaki karakter sayısını alalım.

Algoritmasını yazalım. Bunu adım adım hesaplarsak daha iyi anlaşılacaktır.

Çözümde bize gereken görümde kaç satır olacağı,

Her satırda kaç tane * olacağı,

Her satırda başlangıçta kaç boşluk olacağıdır.

Kod taslağımız aşağıdaki gibi olacaktır.

1. input merkezsatırı; //kullanıcıdan merkez satırdaki * sayısı alınır.<br />

2. int satırsayısı = merkezsatırı*2-1;<br />

3. int satırdakiyıldızsayısı=1; //ilk satırımızda bir * şeklinde başlayacaktır.<br />

Page 72: Android'e Giriş Eğitimleri 1_2

71

4. int satırdakiboşluksayısı = merkezsatırı - satırdakiyıldızsayısı<br />

5. while (satırsayısı&gt;0) {<br />

6. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (satırdakiyıldızsayısı &lt;=

merkezsatırı) {<br />

7.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; while (satırdakiboşluksayısı &gt;= 0) {<br />

8.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print('' ''); //boşluk bastır<br

/>

9.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; }<br />

10.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; print(''x''); //x ve boşluk bastır<br />

11.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; if (satırdakiyıldızsayısı &lt; merkezsatırı)<br />

12.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; satırdakiyıldızsayısı++ ;<br

/>

13.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; else<br />

14.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; satırdakiyıldızsayısı-- ;<br

/>

15.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp; }<br />

16. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print(''\n''); //yeni satıra gecme<br />

17. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; satırsatırsayısı-- ;<br />

Page 73: Android'e Giriş Eğitimleri 1_2

72

18. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; satirdakiboşluksayısı = merkezsatırı -

satırdakiyıldızsayısı;<br />

19. }</p>

20.

21. <p>

Kullanıcı merkez satırı 5 olarak belirlerse, çıkan şekil aşağıdaki gibi olacaktır.

*

* *

* * *

* * * *

* * * * *

* * * *

* * *

* *

*

17.JAVA'DA VERİ SAKLAMAYA YARDIMCI KÜTÜPHANELER

Daha önceki bölümlerde Java'da diziler konusunu görmüştük. Bu bölümde ise Java'nın veri

saklamak için sunduğu bazı özel sınıflardan bahsedeceğiz. java.util kütüphanesi altında bulunan

bu sınıflar, klasik dizilerin bir takım sınırlamalarını ortadan kaldırırken dizi içerisinde arama, silme

gibi ek özellikler de sağlıyor.

Öncelikle Java'da basit bir dizi örneğine göz atalım. Bu örnekte 0 - 9 arası elemanların tamamı

eklenmiş kabul edilsin:

1. String[] strArr = new String[10];<br />

2. strArr[0] = "Ahmet";<br />

3. strArr[1] = "Ayşe";<br />

4. strArr[9] = "Mehmet";Şimdi ise aşağıdaki soruları nasıl yapacağımızı düşünelim;

Bu dizinin içinde Arzu diye bir string var mıdır?

"Ayşe" değerini diziden çıkarmanın yolu nedir? Eleman çıkarıldıktan sonra dizin (index) nasıl

yeniden düzenlenir?

Dizide değeri atanmış kaç adet eleman yer alır?

11. eleman eklenmesi gerektiğinde ne yapılmalıdır?

Yukarıdaki sorular artırılabilir ancak hiçbiri yeni bir metod yazmadan yapılamaz. İşte bu noktada

Java içerisinde yer alan List Interface yardımımıza koşar. Bu eğitimleri alt başlıklarda ayrıntısıyla

bulacaksınız.

Page 74: Android'e Giriş Eğitimleri 1_2

73

17.1.List

Bu Interface kullanıcılara sıralanmış bir dizi hazırlama olanağı sunar. Oluşturulan diziler istenilen

sınıfta obje saklayabildiği gibi kapasiteleri de önceden belirlenmek zorunda değildir. Bununla

beraber bu Interface’i kullanan sınıflar aşağıdaki metodlara sahiptir;

add (E e): Bir objeyi listeye ekler.

add (int index, E e): Bir objeyi listede istenen dizine (index) ekler.

clear: Bütün elemanları siler.

contains: Bir objenin dizi içerisinde olup olmadığını kontrol eder.

get (int index): Dizi içerisinde belirli bir dizindeki objeyi verir.

remove (E e): Belli bir objeyi siler.

remove (int i): Belli bir dizindeki objeyi siler ve dizini günceller.

size: O anda dizide kaç adet eleman olduğunu söyler (add metodu ile eklenmiş).

subList (int from, int to): İki dizin arasındaki elemanlardan yeni bir dizi oluşturur.

set (int index, E element): Belli bir dizindeki objeyi yenisiyle değiştirir.

Gördüğünüz gibi List Interface’i veriyi dizi içerisinde saklama konusunda bize birçok kolaylık sağlar.

Şimdi bu Interface’i kullanan ArrayList adlı sınıfını çeşitli örneklerle anlatalım;

1. List&lt;String&gt; arrList = new ArrayList&lt;String&gt;();<br />

2. arrList.add("Osman");<br />

3. arrList.add("Ayşe");Yukarıdaki örnekte yeni bir dizi oluşturuyoruz ve bu diziye add metodunu

kullanarak çeşitli elemanlar ekliyoruz.

Bir ArrayList içerisindeki elemanları görüntülemek için foreach döngüsünü aşağıdaki gibi

kullanabilirsiniz.

1. for(String str : arrList) {</p>

2.

3. <p>&nbsp;&nbsp;&nbsp; System.out.println(str);</p>

4.

5. <p>}

Burada eğer ilk değerin önüne bir eleman ekleyeceksek aşağıdaki metodu kullanmamız gerekir;

1. List&lt;String&gt; arrList = new ArrayList&lt;String&gt;();<br />

2. &nbsp; &nbsp; &nbsp;arrList.add("Osman");<br />

3. &nbsp; &nbsp; &nbsp;arrList.add("Ayse");<br />

4. &nbsp; &nbsp; &nbsp;arrList.add(0, "Ozan");Bu şekilde “Ozan” objesi “Osman” objesinin

önüne geçmiş olur.

Belirli bir obje dizi içerisinde mevcut mu sorgusu aşağıdaki gibi gerçekleşir;

1. List&lt;String&gt; arrList = new ArrayList&lt;String&gt;();<br />

2. &nbsp; &nbsp; &nbsp; arrList.add("Osman");<br />

3. &nbsp; &nbsp; &nbsp; arrList.add("Ayse");<br />

Page 75: Android'e Giriş Eğitimleri 1_2

74

4. &nbsp; &nbsp; &nbsp; arrList.add(0, "Ozan");<br />

5. &nbsp; &nbsp; &nbsp; if(arrList.contains("Osman")) {<br />

6. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Osman bulundu");<br />

7. &nbsp; &nbsp; &nbsp; }Liste içerisindeki eleman sayısını öğrenmek için size metodundan

faydalanırız. Aşağıdaki örnekte liste önceclear metoduyla boşaltılıyor, ardından size metoduyla

boşaldığı kontrol ediliyor.

1. List&lt;String&gt; arrList = new ArrayList&lt;String&gt;();<br />

2. &nbsp; &nbsp;arrList.add("Osman");<br />

3. &nbsp; &nbsp;arrList.add("Ayse");<br />

4. &nbsp; &nbsp;arrList.add(0, "Ozan"); &nbsp; &nbsp; &nbsp;<br />

5. &nbsp; &nbsp;arrList.clear(); &nbsp; &nbsp; &nbsp;<br />

6. &nbsp; &nbsp;if(arrList.size() == 0) {<br />

7. &nbsp; &nbsp; &nbsp; System.out.println("Liste bos!");<br />

8. &nbsp; &nbsp;}

ArrayList sınıfını Android uygulamaları hazırlarken sık sık kullanacağız.

17.2.Map

Java'da sıkça kullanılan bir diğer veri saklama yolu, Map Interface'i kullanan sınıflardır. Bu sınıflar

verileri anahtar - değer mantığına göre saklarlar. Bir obje Map içerisine eklenirken bu objeyi işaret

eden bir anahtar kullanılır. Daha sonra obje çekilmek istediğinde bu anahtar değeri sorgulanır ve

obje hızlı bir şekilde diğer objeler arasından getirilir.

Map Interface'i kullanan sınıflar aşağıdaki metodlara sahiptir;

clear: Map içinde bulunan bütün değerleri siler.

containsKey (Object key): Belli bir anahtar daha önceden girilmiş mi sorgular.

containsValue (Object value): Belli bir obje daha önceden girilmiş mi sorgular.

get (Object key): Anahtara karşılık gelen objeyi döndürür.

put (Object key, Object value): Anahtar - değer ikilisini kayıt eder.

remove (Object key): Belli bir anahtara karşılık gelen değeri siler.

size: O zaman kadar kayıt edilmiş anahtar - değer ikili sayısını verir.

Şimdi sizlere HashMap sınıfını kullanarak bir kullanıcı ile ilgili değerler saklayan bir Map dizisi

oluşturacağız.

1. Map&lt;String,String&gt; userMap = new HashMap&lt;String, String&gt;();<br />

2. &nbsp; &nbsp; &nbsp; userMap.put("email", "[email protected]");<br />

3. &nbsp; &nbsp; &nbsp; userMap.put("name", "Ahmet Zan");<br />

4. &nbsp; &nbsp; &nbsp; userMap.put("address", "İstanbul 34000");<br />

5. &nbsp; &nbsp; &nbsp; userMap.put("mobile", "5322100000");

Page 76: Android'e Giriş Eğitimleri 1_2

75

Yukarıdaki örnekte userMap adında bir değişken içerisinde Ahmet Zan adında hayali bir kullanıcıya

ait bilgiler anahtar - değer ikilileri halinde saklanmıştır. Daha sonra kullanıcıya ait bir bilgiye ulaşmak

istediğimizde ilgili anahtarı girmemiz yeterli olacaktır;

1. Map&lt;String,String&gt; userMap = new HashMap&lt;String, String&gt;();<br />

2. &nbsp; &nbsp; &nbsp; userMap.put("email", "[email protected]");<br />

3. &nbsp; &nbsp; &nbsp; userMap.put("name", "Ahmet Zan");<br />

4. &nbsp; &nbsp; &nbsp; userMap.put("address", "Istanbul 34000");<br />

5. &nbsp; &nbsp; &nbsp; userMap.put("mobile", "5322100000");<br />

6. &nbsp; &nbsp; &nbsp; System.out.println("Kullanici adresi " +

userMap.get("address"))Aşağıdaki örnekte ise belli bir anahtarın sorgulanmasını görüyoruz;

1. Map&lt;String,String&gt; userMap = new HashMap&lt;String, String&gt;();<br />

2. &nbsp; &nbsp; &nbsp; userMap.put("email", "[email protected]");<br />

3. &nbsp; &nbsp; &nbsp; userMap.put("name", "Ahmet Zan");<br />

4. &nbsp; &nbsp; &nbsp; userMap.put("address", "Istanbul 34000");<br />

5. &nbsp; &nbsp; &nbsp; userMap.put("mobile", "5322100000");<br />

6. &nbsp; &nbsp; &nbsp; if(!userMap.containsKey("twitter")) {<br />

7. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Kullaniciya ait Twitter adresi yok!");

&nbsp;&nbsp;<br />

8. &nbsp; &nbsp; &nbsp; }

Bir Map içerisinde yer alan bütün anahtar - değer ikililerini yazdırmak isterseniz bir foreach

döngüsünden faydalanabilirsiniz.

1. for(Map.Entry&lt;String, String&gt; pairs : userMap.entrySet()) {</p>

2.

3. <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(pairs);</p>

4.

5. <p>}

HashMap'leri Android konuları içerisinde sıklıkla kullanacağız.

17.3.Set

List Interface'ine epey benzeyen Set, verilen verileri bir dizin (index) kullanmadan saklamaktadır.

Aynı zamanda Set'ler aynı elemanı iki kere saklamaya izin vermezler.

Set Interface'ini kullanan sınıflar aşağıdaki metodları içerirler;

add (Object o) : Dizi içerisine bir eleman ekler.

clear: Dizi içerisindeki bütün elemanları siler.

contains (Object o): Bir eleman dizi içinde mi kontrol eder.

remove (Object o): Bir elemanı siler.

size: O ana kadar kaç eleman eklendiğini döndürür.

Page 77: Android'e Giriş Eğitimleri 1_2

76

Aşağıdaki örnek bir TreeSet sınıfı kullanımını göstermektedir;

1. Set&lt;String&gt; treeSet = new TreeSet&lt;String&gt;();<br />

2. &nbsp; &nbsp; &nbsp; treeSet.add("Osman");<br />

3. &nbsp; &nbsp; &nbsp; treeSet.add("Ayse");<br />

4. &nbsp; &nbsp; &nbsp; treeSet.add("Osman");<br />

5. &nbsp; &nbsp; &nbsp; for(String str : treeSet) {<br />

6. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(str);<br />

7. &nbsp; &nbsp; &nbsp; }Yukarıdaki örnekte add metodunu kullanarak elemanlar ekleniyor ve

bir foreach döngüsü ile bu elemanlar konsola basılıyor.

treeSet içerisine iki adet "Osman" objesi eklenmesine rağmen konsolda sadece bir tane "Osman"

değeri görülmektedir. Bunun sebebi Set Interface'ini kullanan sınıfların aynı objeden sadece bir tane

saklamasıdır.

İlerleyen dönemlerde Android uygulamaları içerisinde Set Interface'i ile ilgili örnekler kullanacağız.

18.THREADLER

Tek bir program akışı içerisinde birden fazla işlemin gerçekleştirilmesi Java'da Thread sınıfıyla

mümkündür. Şu ana kadar yaptığımız bütün örnekler ana program akışını takip ederek yapmaları

beklenen görevleri sırayla gerçekleştiriyordu. Thread (iş parçacığı) kullanımı, birden fazla işlemin

tek bir akışı paylaşarak neredeyse eşzamanlı bir şekilde gerçekleşmesini sağlar.

Page 78: Android'e Giriş Eğitimleri 1_2

77

Thread kullanımına bir örnek vermek gerekirse; bir kelime oyunu uygulamasında kullanıcı ana

ekranda oyunu oynuyor olsun. Biz ise tam oyunun en heyecanlı yerinde rasgele bir reklam gösterip

kullanıcının bütün dikkatini reklama yöneltmek isteyelim :). Bu amaçla bizim reklamı uzaktaki bir

sunucudan çekip ana ekrana basan bir kod parçası yazdığımızı varsayalım. Uzaktan dosya yükleme

uzun bir işlem olduğundan bu işlem sırasında oyunu bloke etmememiz gerekir. Bu yüzden Thread

mantığını kullanan bir kod yazarak ana akışta hem oyunu hem de yükleme işlemini ilerleterek iki

işlemin de mevcut kaynakları paylaşarak kullanmasını sağlayabiliriz. Bu şekilde hem kullanıcı

oyununu kesintisiz oynamaya devam eder hem de reklam dosyaları uygulamaya yüklenmiş olur.

NOT: Uzaktan dosya yükleme işlemleri için bu sistemi ileri Android derslerinde sık sık kullanıyor

olacağız.

Java'da Thread kullanan bir program örneği ise aşağıda verilmiştir;

1. public class MyThread implements Runnable {

2. private int end;

3. private String name;

4.

5. public MyThread(String name, int end) {

6. this.end = end;

7. this.name = name;

8. }

9.

10. @Override

11. public void run() {

12. for (int i = 0; i &lt; end; i++) {

13. System.out.println(name + " : " + i);

14. }

15. }

16. }

Thread içerisinde gerçekleştirilecek işlemler öncelikle Runnable Interface'ten üretilmiş herhangi bir

sınıfta tanımlanabilir. Yukarıdaki örnek kodda MyThread adında tanımlanmış bir iş parçacığı

görüntülenmektedir. Runnable içerisindeki run metodu içinde yapılması gereken işlemler belirtilir.

Örnek kod yapıcı (constructor) içinde verilen bir int değeri kadar sayma işlemi yapacak ve bunu

konsola Thread'e verilen isimle birlikte yazacaktır.

1. public class ThreadLesson {

2. public static void main(String[] args) {

3. Thread thread1 = new Thread(new MyThread("thread1", 6));

4. Thread thread2 = new Thread(new MyThread("thread2", 5), "thread2");

Page 79: Android'e Giriş Eğitimleri 1_2

78

5. thread1.start();

6. thread2.start();

7. }

8. }

MyThread adlı iş parçacığını çalıştırmak için Thread adlı sınıftan faydalanırız. Yukarıdaki örnekte

farklı Thread tanımlamaları ve bunların kullanımları görülmektedir. Thread'ler tanımlanırken yapıcı

içerisinde Thread'e ait bir isim de verilebilir. Yukarıdaki kodun çıktısı aşağıdaki gibidir;

thread1 : 0

thread2 : 0

thread2 : 1

thread2 : 2

thread1 : 1

thread2 : 3

thread1 : 2

thread2 : 4

thread1 : 3

thread1 : 4

thread1 : 5

Eğitimin alt başlıklarında threadler ile alakalı setPriority methodu ve Executor Sınıfı hakkında

anlatımlar ve örnekler yapacağız.

18.1.Öncelik Belirleme (setPriority) Metodu

Bir üst ders içeriğinde anlatmış olduğumuz theradlerin çalışma önceliklerini belirlemek

için setPriority metodunu kullanırız. Aşağıdaki örnekte thread3 en yüksek öneme sahipken diğeri

daha az önemli olarak tanımlanmıştır.

1. public class ThreadLesson {<br />

2. &nbsp;&nbsp;&nbsp;public static void main(String[] args) {<br />

3. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread thread1 = new Thread(new

MyThread("thread1", 6));<br />

4. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread thread2 = new Thread(new

MyThread("thread2", 5));<br />

5. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread thread3 = new Thread(new

MyThread("thread3", 4));<br />

6.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread3.setPriority(Thread.MAX_PRIORITY);<br

/>

Page 80: Android'e Giriş Eğitimleri 1_2

79

7.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread1.setPriority(Thread.MIN_PRIORITY);<br

/>

8.

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread2.setPriority(Thread.MIN_PRIORITY);<br

/>

9. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread1.start();<br />

10. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread2.start();<br />

11. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread3.start();<br />

12. &nbsp;&nbsp;&nbsp;}<br />

13. }

Bu örnegimizde setPriority(Thread.MAX_PRIORITY) koduyla threadimizin en öncelikli çalışmasını

sağlamış olduk.

setPriority(Thread.MIN_PRIORITY) koduylaysa threadimizin en düşük öncelikle çalışmasını

sağlamış olduk.

İşlemin çıktısına baktığımızda ise thread1.start() kod da daha önce olmasına rağmen thread3

önceliklendirildiği için işlemini ilk bitirir.

thread1 : 0

thread2 : 0

thread3 : 0

thread1 : 1

thread3 : 1

thread2 : 1

thread3 : 2

thread1 : 2

thread3 : 3

thread2 : 2

thread1 : 3

thread2 : 3

thread1 : 4

thread2 : 4

thread1 : 5

Bu şekilde dilediğimiz kadar iş parçası tanımlayıp eşzamanlı olarak istediğimiz kadar işlem

yapabiliriz. Ancak unutulmaması gereken, oluşturulan her Thread'in sistemin belleğinden ve

işlemciden bir pay aldığıdır. Aşırı sayıda Thread oluşturulması mikroişlemcinin işlemler arası geçiş

yapması gerektiğinden ciddi performans kayıplarına yol açacaktır. Bu işlemleri düzenlemek için bir

sonraki eğitim içeriğinde Executor sınıfının özelliklerini kullanacağız.

Page 81: Android'e Giriş Eğitimleri 1_2

80

18.2.Threadlerin Kontrolü ve Düzenlenmesi

Thread sayısının ve çalışmasının düzenli ve kontrollü bir şekilde gerçekleştirilmesi için Java bize

Executor adında bir sınıf sunar.

1. import java.util.concurrent.ExecutorService;

2. import java.util.concurrent.Executors;

3. import java.util.concurrent.TimeUnit;

4.

5. public class ThreadLesson2 {

6. public static void main(String[] args) throws InterruptedException {

7. ExecutorService executor = Executors.newFixedThreadPool(5);

8.

9. for (int i = 0; i &lt; 20; i++) {

10. Thread thread = new Thread(new MyThread("thread" + i, 3));

11. executor.execute(thread);

12. }

13. executor.shutdown();

14. executor.awaitTermination(10, TimeUnit.SECONDS);

15. System.out.println("Done");

16. }

17. }

ExecutorService bize belli bir anda en fazla kaç Thread çalıştırmak istediğimizi sorar. Yukarıdaki

örneknewFixedThreadPool metodu ile 5 farklı iş parçasının aynı anda çalıştırılabileceği

belirtilmiştir. Daha sonrasında for döngüsü içinde 20 adet Thread tanımlanmasına

rağmen executor servisi gelen işleri düzene sokar ve 5 Thread üzerinde işlem gerçekleştirmez.

Sonradan eklenen işlemler sıraya (queue) sokulur ve mevcut işlemler bitirildikçe çalıştırılır. Böylece

sistem kaynakları işlem parçaları tarafından kontrolsüzce harcanamaz. shutdown metodu ise yeni

işlem alımını durdurur ve mevcut işlemlerin bitirilmesini sağlar. awaitTermination ise mevcut

işlemlerin bitirilmesi için belirli bir süre tanır ve bu sürenin sonunda ExecutorService tamamen

kapatılır.

Tanımlanan işlemlerin belirli bir zaman sonra otomatik başlatılması ya da sistematik olarak belli bir

frekansla çalıştırılması için Java bizlere ScheduledExecutorService adında bir sınıf sunar. Bu sistem

sayesinde yapılan işlemlerin belirli bir tarihte başlamasını ya da sürekli olarak işlemin tekrar

edilmesini sağlayabiliriz.

1. import java.util.concurrent.Executors;

2. import java.util.concurrent.ScheduledExecutorService;

3. import java.util.concurrent.TimeUnit;

Page 82: Android'e Giriş Eğitimleri 1_2

81

4.

5. public class ThreadLesson3 {

6. public static void main(String[] args) throws InterruptedException {

7. ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);

8. MyThread worker = new MyThread("Thread 1", 3);

9. pool.schedule(worker, 5, TimeUnit.SECONDS);

10. Thread.sleep(20000);

11. pool.shutdown();

12. }

13. }

Yukarıdaki örnekte ExecutorService yerine ScheduledExecutorService kullanılarak işlemin ileri bir

tarihte gerçekleşmesi sağlanır. schedule metodu ile verilen iş parçası 5 saniye gecikmeli

çalışacaktır. Thread.sleep metodu ise ana akışı durdurur ancak MyThread ile tanımlanan worker iş

parçası ScheduledExecutorService tarafından çalıştırılır. Konsol çıktısı aşağıdaki gibidir;

Thread 1 : 0

Thread 1 : 1

Thread 1 : 2

Dilerseniz scheduleAtFixedRate metodu ile işlemin sürekli çalışmasını sağlayabilirsiniz.

NOT : Zamanlama işlemleri için Java'da Timer adında bir sınıf da kullanılmaktadır, ancak Android

uygulamalarında zamanlayıcılar için ScheduledExecutorService kullanılması tavsiye edilmektedir.

Page 83: Android'e Giriş Eğitimleri 1_2

82

Kaynakça https://developer.android.com/index.html

http://source.android.com/

http://www.yazilimcilardunyasi.com/p/mobil-programlama.html

http://www.programlamadefteri.com/android-programlama-dersleri

https://gelecegiyazanlar.turkcell.com.tr/konu/android