SlideShare uma empresa Scribd logo
1 de 83
Baixar para ler offline
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.
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
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
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. }
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.
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++) {
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");
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.
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ı:
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.
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.
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. }
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.
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;
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
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
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;
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: ");
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,
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];
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,
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ı:
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:
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.
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. }
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},
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},
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},
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];
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. }
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.
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++) {
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ı:
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.
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;
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;
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++){
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={
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("");
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},
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. }
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;
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: ");
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 />
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 />
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ı
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.
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.
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.
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.
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
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();
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:
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 buncan");
9. yazar.write("gormuyor gelip gecenlern");
10. yazar.write("egilip aliyorumn");
11. yazar.write("solgun bir gul oluyor dokununca - behcet necatigiln");
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:
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:
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. }
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.
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);
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.
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.
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. }
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ı
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.
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.
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.
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.
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. }
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.
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.
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.
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 />
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 />
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.
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 />
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", "ahmet@example.com");<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");
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", "ahmet@example.com");<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", "ahmet@example.com");<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.
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2
Android'e Giriş Eğitimleri 1_2

Mais conteúdo relacionado

Destaque

Satış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business School
Satış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business SchoolSatış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business School
Satış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business SchoolUniverist
 
Cinsel Saldırı ve Cezai Boyutları
Cinsel Saldırı ve Cezai BoyutlarıCinsel Saldırı ve Cezai Boyutları
Cinsel Saldırı ve Cezai BoyutlarıUniverist
 
Öfke ve Stresle Baş Etme Yöntemi
Öfke ve Stresle Baş Etme YöntemiÖfke ve Stresle Baş Etme Yöntemi
Öfke ve Stresle Baş Etme YöntemiUniverist
 
Maslow ve Varoluşcu Yaklaşım
Maslow ve Varoluşcu YaklaşımMaslow ve Varoluşcu Yaklaşım
Maslow ve Varoluşcu YaklaşımUniverist
 
Temel Düzeyde Autocad Eğitimleri 2
Temel Düzeyde Autocad Eğitimleri 2Temel Düzeyde Autocad Eğitimleri 2
Temel Düzeyde Autocad Eğitimleri 2Univerist
 
50 Soruda Sosyal Güvenlik Uygulamaları
50 Soruda Sosyal Güvenlik Uygulamaları50 Soruda Sosyal Güvenlik Uygulamaları
50 Soruda Sosyal Güvenlik UygulamalarıUniverist
 
Televizyonun Çocuklar Üzerindeki Etkisi
Televizyonun Çocuklar Üzerindeki EtkisiTelevizyonun Çocuklar Üzerindeki Etkisi
Televizyonun Çocuklar Üzerindeki EtkisiUniverist
 
İletişimde Farkındalık-2
İletişimde Farkındalık-2İletişimde Farkındalık-2
İletişimde Farkındalık-2Univerist
 
Okullarda Şiddet ve Alınabilecek Tedbirler
Okullarda Şiddet ve Alınabilecek TedbirlerOkullarda Şiddet ve Alınabilecek Tedbirler
Okullarda Şiddet ve Alınabilecek TedbirlerUniverist
 
Fiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business School
Fiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business SchoolFiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business School
Fiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business SchoolUniverist
 
5-6 Yaşındaki Çocukların Velilerine Öneriler
5-6 Yaşındaki Çocukların Velilerine Öneriler5-6 Yaşındaki Çocukların Velilerine Öneriler
5-6 Yaşındaki Çocukların Velilerine ÖnerilerUniverist
 
Tikler ve Travma
Tikler ve TravmaTikler ve Travma
Tikler ve TravmaUniverist
 
Yaşam Koçluğu Sertifika Programı
Yaşam Koçluğu Sertifika ProgramıYaşam Koçluğu Sertifika Programı
Yaşam Koçluğu Sertifika ProgramıUniverist
 
Temel Photoshop E-Eğitimi
Temel Photoshop E-EğitimiTemel Photoshop E-Eğitimi
Temel Photoshop E-EğitimiUniverist
 
Temel Düzeyde Photoshop Eğitimleri 2
Temel Düzeyde Photoshop Eğitimleri 2Temel Düzeyde Photoshop Eğitimleri 2
Temel Düzeyde Photoshop Eğitimleri 2Univerist
 
Çocuk İstismarı
Çocuk İstismarıÇocuk İstismarı
Çocuk İstismarıUniverist
 
Temel WordPress E-Eğitimi
Temel WordPress E-EğitimiTemel WordPress E-Eğitimi
Temel WordPress E-EğitimiUniverist
 
Özgüven Geliştirme Yöntemleri-2
Özgüven Geliştirme Yöntemleri-2Özgüven Geliştirme Yöntemleri-2
Özgüven Geliştirme Yöntemleri-2Univerist
 
Motivasyon ve Kaygı
Motivasyon ve KaygıMotivasyon ve Kaygı
Motivasyon ve KaygıUniverist
 
Davranışcı,Humanist ve Gerçekci Yaklaşım
Davranışcı,Humanist ve Gerçekci YaklaşımDavranışcı,Humanist ve Gerçekci Yaklaşım
Davranışcı,Humanist ve Gerçekci YaklaşımUniverist
 

Destaque (20)

Satış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business School
Satış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business SchoolSatış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business School
Satış Yönetimi - Satış Liderliği Sunum e-Micro MBA /Univerist Business School
 
Cinsel Saldırı ve Cezai Boyutları
Cinsel Saldırı ve Cezai BoyutlarıCinsel Saldırı ve Cezai Boyutları
Cinsel Saldırı ve Cezai Boyutları
 
Öfke ve Stresle Baş Etme Yöntemi
Öfke ve Stresle Baş Etme YöntemiÖfke ve Stresle Baş Etme Yöntemi
Öfke ve Stresle Baş Etme Yöntemi
 
Maslow ve Varoluşcu Yaklaşım
Maslow ve Varoluşcu YaklaşımMaslow ve Varoluşcu Yaklaşım
Maslow ve Varoluşcu Yaklaşım
 
Temel Düzeyde Autocad Eğitimleri 2
Temel Düzeyde Autocad Eğitimleri 2Temel Düzeyde Autocad Eğitimleri 2
Temel Düzeyde Autocad Eğitimleri 2
 
50 Soruda Sosyal Güvenlik Uygulamaları
50 Soruda Sosyal Güvenlik Uygulamaları50 Soruda Sosyal Güvenlik Uygulamaları
50 Soruda Sosyal Güvenlik Uygulamaları
 
Televizyonun Çocuklar Üzerindeki Etkisi
Televizyonun Çocuklar Üzerindeki EtkisiTelevizyonun Çocuklar Üzerindeki Etkisi
Televizyonun Çocuklar Üzerindeki Etkisi
 
İletişimde Farkındalık-2
İletişimde Farkındalık-2İletişimde Farkındalık-2
İletişimde Farkındalık-2
 
Okullarda Şiddet ve Alınabilecek Tedbirler
Okullarda Şiddet ve Alınabilecek TedbirlerOkullarda Şiddet ve Alınabilecek Tedbirler
Okullarda Şiddet ve Alınabilecek Tedbirler
 
Fiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business School
Fiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business SchoolFiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business School
Fiyatlandırma - Stratejik Pazarlama Sunum e-Micro MBA /Univerist Business School
 
5-6 Yaşındaki Çocukların Velilerine Öneriler
5-6 Yaşındaki Çocukların Velilerine Öneriler5-6 Yaşındaki Çocukların Velilerine Öneriler
5-6 Yaşındaki Çocukların Velilerine Öneriler
 
Tikler ve Travma
Tikler ve TravmaTikler ve Travma
Tikler ve Travma
 
Yaşam Koçluğu Sertifika Programı
Yaşam Koçluğu Sertifika ProgramıYaşam Koçluğu Sertifika Programı
Yaşam Koçluğu Sertifika Programı
 
Temel Photoshop E-Eğitimi
Temel Photoshop E-EğitimiTemel Photoshop E-Eğitimi
Temel Photoshop E-Eğitimi
 
Temel Düzeyde Photoshop Eğitimleri 2
Temel Düzeyde Photoshop Eğitimleri 2Temel Düzeyde Photoshop Eğitimleri 2
Temel Düzeyde Photoshop Eğitimleri 2
 
Çocuk İstismarı
Çocuk İstismarıÇocuk İstismarı
Çocuk İstismarı
 
Temel WordPress E-Eğitimi
Temel WordPress E-EğitimiTemel WordPress E-Eğitimi
Temel WordPress E-Eğitimi
 
Özgüven Geliştirme Yöntemleri-2
Özgüven Geliştirme Yöntemleri-2Özgüven Geliştirme Yöntemleri-2
Özgüven Geliştirme Yöntemleri-2
 
Motivasyon ve Kaygı
Motivasyon ve KaygıMotivasyon ve Kaygı
Motivasyon ve Kaygı
 
Davranışcı,Humanist ve Gerçekci Yaklaşım
Davranışcı,Humanist ve Gerçekci YaklaşımDavranışcı,Humanist ve Gerçekci Yaklaşım
Davranışcı,Humanist ve Gerçekci Yaklaşım
 

Semelhante a Android'e Giriş Eğitimleri 1_2

Roket Yazılımı Eğitimi Hafta 1
Roket Yazılımı Eğitimi Hafta 1Roket Yazılımı Eğitimi Hafta 1
Roket Yazılımı Eğitimi Hafta 1Uğurkan Ateş
 
Introduction to iOS Programming && About XMPPFramework
Introduction to iOS Programming && About XMPPFrameworkIntroduction to iOS Programming && About XMPPFramework
Introduction to iOS Programming && About XMPPFrameworkAnıl Sözeri
 
Diziler C#
Diziler C#Diziler C#
Diziler C#Batu54
 
Java ile programlamaya giris ramadan sanli
Java ile programlamaya giris ramadan sanliJava ile programlamaya giris ramadan sanli
Java ile programlamaya giris ramadan sanliRamadan ŞANLI
 
Programlama Temelleri Hazır Metodlar
Programlama Temelleri Hazır MetodlarProgramlama Temelleri Hazır Metodlar
Programlama Temelleri Hazır Metodlarkadirolmez
 
Struts 2 Ile Tanisma
Struts 2 Ile TanismaStruts 2 Ile Tanisma
Struts 2 Ile Tanismaokanozeren
 
Introduction to Java programming
Introduction to Java programmingIntroduction to Java programming
Introduction to Java programmingAnıl Sözeri
 
Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI Emrah Kahraman
 
Introduction to Android Programming
Introduction to Android ProgrammingIntroduction to Android Programming
Introduction to Android ProgrammingAnıl Sözeri
 

Semelhante a Android'e Giriş Eğitimleri 1_2 (14)

Roket Yazılımı Eğitimi Hafta 1
Roket Yazılımı Eğitimi Hafta 1Roket Yazılımı Eğitimi Hafta 1
Roket Yazılımı Eğitimi Hafta 1
 
Introduction to iOS Programming && About XMPPFramework
Introduction to iOS Programming && About XMPPFrameworkIntroduction to iOS Programming && About XMPPFramework
Introduction to iOS Programming && About XMPPFramework
 
Recep proje 5
Recep proje 5Recep proje 5
Recep proje 5
 
Diziler C#
Diziler C#Diziler C#
Diziler C#
 
Java ile programlamaya giris ramadan sanli
Java ile programlamaya giris ramadan sanliJava ile programlamaya giris ramadan sanli
Java ile programlamaya giris ramadan sanli
 
Programlama Temelleri Hazır Metodlar
Programlama Temelleri Hazır MetodlarProgramlama Temelleri Hazır Metodlar
Programlama Temelleri Hazır Metodlar
 
Java script
Java scriptJava script
Java script
 
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
BTRisk X86 Tersine Mühendislik Eğitim Sunumu - Bölüm-3
 
Struts 2 Ile Tanisma
Struts 2 Ile TanismaStruts 2 Ile Tanisma
Struts 2 Ile Tanisma
 
Junit
JunitJunit
Junit
 
Extjs 4 education
Extjs 4 educationExtjs 4 education
Extjs 4 education
 
Introduction to Java programming
Introduction to Java programmingIntroduction to Java programming
Introduction to Java programming
 
Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI Emrah KAHRAMAN - Java RMI
Emrah KAHRAMAN - Java RMI
 
Introduction to Android Programming
Introduction to Android ProgrammingIntroduction to Android Programming
Introduction to Android Programming
 

Mais de Univerist

Kariyer Yapma Yöntemleri
Kariyer Yapma YöntemleriKariyer Yapma Yöntemleri
Kariyer Yapma YöntemleriUniverist
 
İşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları Yönetimiİşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları YönetimiUniverist
 
Stratejik Yönetimin Faydaları
Stratejik Yönetimin FaydalarıStratejik Yönetimin Faydaları
Stratejik Yönetimin FaydalarıUniverist
 
Sertifika Eğitimi Zorunluluğu
Sertifika Eğitimi ZorunluluğuSertifika Eğitimi Zorunluluğu
Sertifika Eğitimi ZorunluluğuUniverist
 
6 Sigma Yöntemi
6 Sigma Yöntemi6 Sigma Yöntemi
6 Sigma YöntemiUniverist
 
Yaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir HayatYaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir HayatUniverist
 
Yaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm OlunYaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm OlunUniverist
 
Yaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi EğitinYaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi EğitinUniverist
 
Vizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi OluştursunVizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi OluştursunUniverist
 
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 AdımSürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 AdımUniverist
 
Koçluk Hizmetiyle Değişim
Koçluk Hizmetiyle DeğişimKoçluk Hizmetiyle Değişim
Koçluk Hizmetiyle DeğişimUniverist
 
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip OlunKoçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip OlunUniverist
 
Kelimelerinizi Güçlendirin
Kelimelerinizi GüçlendirinKelimelerinizi Güçlendirin
Kelimelerinizi GüçlendirinUniverist
 
Bir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 FaydasıBir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 FaydasıUniverist
 
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şeyİsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 ŞeyUniverist
 
Bir Koçla Çalışın
Bir Koçla ÇalışınBir Koçla Çalışın
Bir Koçla ÇalışınUniverist
 
Beyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya BağımlıBeyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya BağımlıUniverist
 
Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5Univerist
 
Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6Univerist
 

Mais de Univerist (20)

Kariyer Yapma Yöntemleri
Kariyer Yapma YöntemleriKariyer Yapma Yöntemleri
Kariyer Yapma Yöntemleri
 
İşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları Yönetimiİşletmelerde İnsan Kaynakları Yönetimi
İşletmelerde İnsan Kaynakları Yönetimi
 
Stratejik Yönetimin Faydaları
Stratejik Yönetimin FaydalarıStratejik Yönetimin Faydaları
Stratejik Yönetimin Faydaları
 
Sertifika Eğitimi Zorunluluğu
Sertifika Eğitimi ZorunluluğuSertifika Eğitimi Zorunluluğu
Sertifika Eğitimi Zorunluluğu
 
E Sertifika
E SertifikaE Sertifika
E Sertifika
 
6 Sigma Yöntemi
6 Sigma Yöntemi6 Sigma Yöntemi
6 Sigma Yöntemi
 
Yaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir HayatYaşam Koçuyla Daha Kolay Bir Hayat
Yaşam Koçuyla Daha Kolay Bir Hayat
 
Yaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm OlunYaşam Koçuyla Çözüm Olun
Yaşam Koçuyla Çözüm Olun
 
Yaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi EğitinYaşam Koçuyla Çevrenizi Eğitin
Yaşam Koçuyla Çevrenizi Eğitin
 
Vizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi OluştursunVizyonunuz Hedeflerinizi Oluştursun
Vizyonunuz Hedeflerinizi Oluştursun
 
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 AdımSürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
Sürdürülebilir ve Tatmin Edici Başarıya Ulaşmak için 10 Adım
 
Koçluk Hizmetiyle Değişim
Koçluk Hizmetiyle DeğişimKoçluk Hizmetiyle Değişim
Koçluk Hizmetiyle Değişim
 
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip OlunKoçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
Koçluk Hizmetiyle 10 Kat Fazla Sevgiye Sahip Olun
 
Kelimelerinizi Güçlendirin
Kelimelerinizi GüçlendirinKelimelerinizi Güçlendirin
Kelimelerinizi Güçlendirin
 
Bir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 FaydasıBir Yaşam Koçu İle Çalışmanın 6 Faydası
Bir Yaşam Koçu İle Çalışmanın 6 Faydası
 
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şeyİsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
İsteğiniz Hayata Kavuşmak İçin Yapmanız Gereken 25 Şey
 
Bir Koçla Çalışın
Bir Koçla ÇalışınBir Koçla Çalışın
Bir Koçla Çalışın
 
Beyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya BağımlıBeyniniz Haklı Olmaya Bağımlı
Beyniniz Haklı Olmaya Bağımlı
 
Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5Personel,Özlük İşleri ve Bordrolama-5
Personel,Özlük İşleri ve Bordrolama-5
 
Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6Personel,Özlük İşleri ve Bordrolama-6
Personel,Özlük İşleri ve Bordrolama-6
 

Android'e Giriş Eğitimleri 1_2

  • 1. 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.
  • 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
  • 3. 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
  • 4. 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. }
  • 5. 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.
  • 6. 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&lt;=st1.length()-1; i++) {
  • 7. 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&gt;0) { 16. System.out.println(""); 17. System.out.println(st1+" &gt; "+"zehra");
  • 8. 7 18. } 19. 20. if(i&lt;0) { 21. System.out.println(""); 22. System.out.println(st1+" &lt; "+"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.
  • 9. 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&gt;0) { 16. System.out.println(""); 17. System.out.println(st1+" &gt; "+"ayse"); 18. } 19. 20. if(i&lt;0) { 21. System.out.println(""); 22. System.out.println(st1+" &lt; "+"ayse"); 23. } 24. System.out.println("i="+i); 25. } 26. } Programın Çıktısı:
  • 10. 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&lt;=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.
  • 11. 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&lt;=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&lt;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.
  • 12. 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&lt;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&lt;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&lt;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. }
  • 13. 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.
  • 14. 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;
  • 15. 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
  • 16. 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
  • 17. 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;
  • 18. 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 &lt;= 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 &lt;= 5; i++) { 10. System.out.print("Bir sayi giriniz: ");
  • 19. 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,
  • 20. 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&lt;=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];
  • 21. 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,
  • 22. 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ı:
  • 23. 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:
  • 24. 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.
  • 25. 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. }
  • 26. 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},
  • 27. 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},
  • 28. 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},
  • 29. 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];
  • 30. 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. }
  • 31. 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.
  • 32. 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++) {
  • 33. 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ı:
  • 34. 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.
  • 35. 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;
  • 36. 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;
  • 37. 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++){
  • 38. 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={
  • 39. 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("");
  • 40. 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},
  • 41. 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. }
  • 42. 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;
  • 43. 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: ");
  • 44. 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 />
  • 45. 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 />
  • 46. 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ı
  • 47. 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.
  • 48. 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.
  • 49. 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.
  • 50. 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.
  • 51. 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
  • 52. 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();
  • 53. 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:
  • 54. 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 buncan"); 9. yazar.write("gormuyor gelip gecenlern"); 10. yazar.write("egilip aliyorumn"); 11. yazar.write("solgun bir gul oluyor dokununca - behcet necatigiln"); 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:
  • 55. 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:
  • 56. 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. }
  • 57. 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.
  • 58. 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);
  • 59. 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.
  • 60. 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.
  • 61. 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. }
  • 62. 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ı
  • 63. 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.
  • 64. 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.
  • 65. 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.
  • 66. 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.
  • 67. 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. }
  • 68. 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.
  • 69. 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.
  • 70. 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.
  • 71. 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 />
  • 72. 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 />
  • 73. 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.
  • 74. 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 />
  • 75. 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", "ahmet@example.com");<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");
  • 76. 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", "ahmet@example.com");<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", "ahmet@example.com");<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.