Bölüm 5: Dizgi

Bölüm 5: Dizgi · Çalışma Soruları
Birleştirmechar aritmetiğiİndislemeMetotlarDeğiştirilemezlikStringBuilderScannerDizgi havuzucompareToprintf
Sercan KÜLCÜ

Çoktan Seçmeli · Dizgi Kavramı

Soru 1: Birleştirme Sırası

System.out.println(1 + 2 + "3" + 4 * 5); ne yazdırır?

B: Önce çarpma yapılır: 4 * 5 = 20. Sonra + soldan sağa işlenir: 1 + 2 = 3 (iki sayı), 3 + "3" = "33" (bir yan dizgi, birleştirme), "33" + 20 = "3320". A ilk iki sayıyı da birleştirir; C çarpmayı unutur.

Çıktı Sorusu · Dizgi Kavramı

Soru 2: char ile Aritmetik

Program ne yazdırır? ('A' = 65, 'B' = 66)

char c = 'A';
System.out.println(c + 2);
System.out.println((char) (c + 2));
System.out.println("" + c + 2);
System.out.println(c + 'B' + "C");
System.out.println("" + 1 + 2 + '3');
Cevabı göster
67
C
A2
131C
123
  • char + int sayısal toplamadır: 65 + 2 = 67.
  • Sonucu (char) ile çevirmek kod 67'nin karakterini verir: C.
  • Başta "" olunca her + birleştirmedir: "A" + 2 = "A2".
  • c + 'B' iki char toplamıdır (65 + 66 = 131); ardından "C" eklenir.
  • "" + 1 = "1", + 2 = "12", + '3' = "123".

Çıktı Sorusu · Dizgi Kavramı

Soru 3: Geriye Doğru İndisleme

Program ne yazdırır?

String s = "Giresun";
String t = "";
for (int i = s.length() - 1; i >= 0; i -= 2) {
  t += s.charAt(i);
}
System.out.println(t + " " + t.length());
System.out.println(s.substring(2, 5)
    + s.indexOf("sun") + s.indexOf('x'));
Cevabı göster
nsrG 4
res4-1

İndisler: G0 i1 r2 e3 s4 u5 n6. Döngü 6, 4, 2, 0 indislerini okur: n, s, r, G.

substring(2, 5) 2 dahil 5 hariç: "res". "sun" indis 4'te başlar; 'x' yoktur, −1. Soldaki "res" dizgi olduğu için 4 ve −1 sayı olarak eklenmez, metne yapışır: "res4-1".

Hata Bulma · Dizgi Kavramı

Soru 4: Tersten Yazdırmada Sınır

Kod, dizginin bütün karakterlerini sondan başa, aralarına tire koyarak yazdırmak için yazıldı. Program ne yazdırır? Hata nerede?

String kelime = "Ada Kaya";
for (int i = kelime.length() - 1; i > 0; i--) {
  System.out.print("-" + kelime.charAt(i));
}
Cevabı göster
-a-y-a-K- -a-d

Uzunluk 8: indisler A0 d1 a2 (boşluk)3 K4 a5 y6 a7. Döngü 7'den 1'e iner; i > 0 koşulu yüzünden indis 0'daki "A" yazılmaz. Boşluk da bir karakterdir: "- " olarak görünür.

Düzeltme: koşul i >= 0 olmalı. Çıktı -a-y-a-K- -a-d-A olur.

Adım Adım Çalıştırma · Dizgi Metotları

Soru 5: E-posta Adresini Ayırmak

Her satırdan sonra indisler ve parçalar nedir? Program ne yazdırır?

ali.veli@giresun.edu.tr081620

23 karakter; indisler 0 … 22. Kodda dizgi hiç değişmeyecek: her metot yeni değer döndürür.

ali.veli@giresun.edu.tr081620at

indexOf('@') ilk @'nin indisi: 8 ("ali.veli" 8 karakter).

ali.veli@giresun.edu.tr081620atnokta

Arama indis 8'den başlar: 3'teki nokta atlanır, ilk nokta 16'da bulunur.

ali.veli@giresun.edu.tr081620at

substring(0, 8): 0 … 7, bitiş hariç.

ali.veli@giresun.edu.tr081620atnokta

substring(9, 16): @'den sonrası, noktaya kadar: 7 karakter.

ali.veli@giresun.edu.tr081620son nokta

lastIndexOf('.') = 20; substring(21) sona kadar: "tr".

ali.veli@giresun.edu.tr081620

replace('.', ' ') yeni bir dizgi döndürür; kullanici yine "ali.veli"dir.

String e = "ali.veli@giresun.edu.tr";
int at = e.indexOf('@');
int nokta = e.indexOf('.', at);
String kullanici = e.substring(0, at);
String alan = e.substring(at + 1, nokta);
String uzanti = e.substring(e.lastIndexOf('.') + 1);
System.out.println(kullanici.replace('.', ' ')
    + " " + alan + " " + uzanti);

Çoktan Seçmeli · Dizgi Metotları

Soru 6: substring ve indexOf

Program ne yazdırır?

String s = "Java Programlama";
System.out.println("[" + s.substring(5, 9) + "] "
    + s.indexOf("a", 2) + " "
    + s.lastIndexOf("am"));

D: Program 5'te başlar; substring(5, 9) 5, 6, 7, 8 indislerini alır: "Prog" (bitiş hariç, uzunluk 9 − 5 = 4). indexOf("a", 2) aramaya indis 2'den başlar: 1'deki a atlanır, 3 bulunur. "am" 10 ve 13'te geçer; lastIndexOf sonuncusunu verir.

Çıktı Sorusu · Dizgi Metotları

Soru 7: split, trim ve parseInt

Program ne yazdırır?

String s = " 3,elma, 12 ,armut ";
String[] p = s.trim().split(",");
System.out.println(p.length + " [" + p[2] + "]");
int toplam = Integer.parseInt(p[0])
    + Integer.parseInt(p[2].trim());
System.out.println(toplam + " "
    + String.join("-", p[1], p[3]));
System.out.println("Giresun".replace("e", "E")
    .toLowerCase().indexOf('e'));
Cevabı göster
4 [ 12 ]
15 elma-armut
3

trim() yalnızca baştaki ve sondaki boşlukları atar; split(",") parçaların içindeki boşluklara dokunmaz: p = ["3", "elma", " 12 ", "armut"].

parseInt(" 12 ") NumberFormatException fırlatırdı; önce trim() gerekir: 3 + 12 = 15. Son satırda "GirEsun" küçük harfe çevrilince yine "giresun" olur; ilk e indis 3'te.

Çoktan Seçmeli · Değiştirilemezlik

Soru 8: Sonucu Atamamak

Program ne yazdırır?

String s = "java";
s.toUpperCase();
s.concat("!");
String t = s.replace('a', 'o');
System.out.println(s + " " + t);

A: String değiştirilemez: toUpperCase() ve concat("!") yeni dizgiler döndürür, ama sonuçlar atanmadığı için kaybolur; s hâlâ "java"dır. replace sonucu t'ye atanmıştır: "jovo". Değişiklik için s = s.toUpperCase(); yazılır.

Adım Adım Çalıştırma · Değiştirilemezlik

Soru 9: StringBuilder İzleme

Her satırdan sonra tamponun içeriği nedir? Program ne yazdırır?

d0e1r2s3tek nesne, içeriği değişebilir

Değiştirilebilir bir karakter tamponu oluşur.

d0e1r2s34425!6append

append aynı nesneyi döndürür; bu yüzden zincirlenebilir. 42 sayısı "42" olarak eklenir.

J0a1v2a3·4d5e6r7s849210!11insert(0, …)

insert(0, "Java ") başa ekler; eski karakterler 5 sağa kayar.

J0a1v2a3·4D5e6r7s849210!11setCharAt(5, 'D')

İndis 5'teki 'd' yerinde 'D' olur. String'de charAt(5) = 'D' yazılamazdı.

J0a1v2a3·4D5e6r7s849!10deleteCharAt(10)

length() − 2 = 10: indis 10'daki '2' silinir; '!' sola kayar.

!041s2r3e4D5·6a7v8a9J10reverse()

reverse tamponu yerinde ters çevirir.

!041s2r3e4D5·6a7v8a9J10toString()

toString() içerikten yeni bir String üretir.

StringBuilder sb = new StringBuilder("ders");
sb.append(42).append('!');
sb.insert(0, "Java ");
sb.setCharAt(5, 'D');
sb.deleteCharAt(sb.length() - 2);
sb.reverse();
String s = sb.toString();
System.out.println(s + " " + s.length());

Çoktan Seçmeli · Değiştirilemezlik

Soru 10: Döngüde Birleştirme

n parçayı bir döngüde s += parca; ile birleştirmek neden yavaştır?

C: String değiştirilemediği için her += eski içeriği ve yeni parçayı yeni bir nesneye kopyalar; kopyalanan karakterler 1 + 2 + … + n büyür. StringBuilder.append aynı tamponu büyütür; toplam iş ortalamada O(n). Havuz yalnızca dizgi sabitlerini tutar (A); String'in böyle bir uzunluk sınırı yoktur (B).

Çıktı Sorusu · Kullanıcı Girişi

Soru 11: nextInt, next ve nextLine

Klavyeden 25⏎Ali Veli Can⏎ girilir. Program ne yazdırır?

Scanner k = new Scanner(System.in);
int yas = k.nextInt();
String a = k.nextLine();
String b = k.next();
String c = k.nextLine();
System.out.println("[" + a + "][" + b + "]["
    + c + "] " + yas);
Cevabı göster
[][Ali][ Veli Can] 25

nextInt() yalnızca 25'i okur, ardındaki ⏎ tamponda kalır. İlk nextLine() o ⏎'ye kadar olan boş metni okur: a = "".

next() bir kelime okur: "Ali". Son nextLine() satırın kalanını alır; "Ali"den sonraki boşluk da satırın parçasıdır: " Veli Can".

Çoktan Seçmeli · Kullanıcı Girişi

Soru 12: next ve nextLine

Girdi satırı ␣␣␣merhaba dünya⏎ (başta üç boşluk). String a = k.next(); String b = k.nextLine(); sonrası a ve b nedir?

D: next() baştaki boşlukları atlar ve bir sonraki boşluğa kadar okur: "merhaba". nextLine() kaldığı yerden satır sonuna kadar her şeyi alır; "merhaba"dan sonraki boşluk da dahildir. ⏎ tüketilir ama sonuca katılmaz.

Adım Adım Çalıştırma · Karşılaştırma

Soru 13: Dizgi Havuzu

Her satırdan sonra hangi değişken hangi nesneyi gösterir? Program ne yazdırır?

yığınabcdefheapdizgi havuzu"ders""de""rs"

Dizgi sabitleri sınıf yüklenirken havuza girer; a havuzdaki "ders"i gösterir.

yığınabcdefheapdizgi havuzu"ders""de""rs"

"de" + "rs" iki sabittir; derleyici onu "ders" olarak hesaplar: b aynı havuz nesnesini gösterir.

yığınabcdefheapdizgi havuzu"ders""de""rs""ders"

new her zaman havuz dışında yeni bir nesne üretir.

yığınabcdefheapdizgi havuzu"ders""de""rs""ders"

d = c referansı kopyalar: ikisi aynı nesne.

yığınabcdefheapdizgi havuzu"ders""de""rs""ders"

e havuzdaki "de"yi gösterir.

yığınabcdefheapdizgi havuzu"ders""de""rs""ders""ders"

e bir değişkendir: e + "rs" çalışma zamanında hesaplanır ve yeni bir nesne üretir.

yığınabcdefheapdizgi havuzu"ders""de""rs""ders""ders"

== referansları karşılaştırır: a ile b aynı havuz nesnesi, c ile d aynı heap nesnesi.

yığınabcdefheapdizgi havuzu"ders""de""rs""ders""ders"

f farklı nesnedir ama içeriği aynıdır. f.intern() havuzdaki eşini, yani a'nın nesnesini döndürür.

String a = "ders";
String b = "de" + "rs";
String c = new String("ders");
String d = c;
String e = "de";
String f = e + "rs";
System.out.println((a == b) + " " + (a == c) + " " + (c == d));
System.out.println((a == f) + " " + a.equals(f) + " " + (a == f.intern()));

Çoktan Seçmeli · Karşılaştırma

Soru 14: compareTo

"kalem".compareTo("kale") ve "Kale".compareTo("kale") sırasıyla ne döndürür? ('K' = 75, 'k' = 107)

A: "kale", "kalem"in önekidir: farklı karakter yoktur, uzunluk farkı döner: 5 − 4 = 1 (pozitif: "kalem" sonra gelir). İkincide ilk farklı karakterler 'K' ve 'k': 75 − 107 = −32. Büyük harfler küçüklerden önce sıralanır.

Çoktan Seçmeli · Karşılaştırma

Soru 15: null ile Karşılaştırma

String cevap = null; iken aşağıdaki satırlardan hangisi istisna fırlatır?

C: null bir referans üzerinden metot çağrılamaz: NullPointerException. A ve B'de metot sabit üzerinde çağrılır; null argümanla false döner. D'de birleştirme null'ı "null" metnine çevirir: null!. Bu yüzden sabit öne yazılır: "evet".equals(cevap).

Çıktı Sorusu · Biçimli Çıktı

Soru 16: printf Genişlik ve Hassasiyet

Türkçe yerel ayarlı (tr-TR) bilgisayarda çıktıyı karakter karakter yazın.

System.out.printf("[%5s][%-6s][%04d][%6.2f][%.0f]%n",
    "abc", "de", 37, 3.14159, 2.5);
Cevabı göster
[  abc][de    ][0037][  3,14][3]
  • %5s: 5 karakter, sağa hizalı → ··abc.
  • %-6s: sola hizalı, sağa 4 boşluk → de····.
  • %04d: başa sıfır doldurur → 0037.
  • %6.2f: 2 ondalık, toplam 6 karakter; ayırıcı tr-TR'de virgül → ··3,14.
  • %.0f: ondalıksız; Java yarımı yukarı yuvarlar (HALF_UP): 2.5 → 3.

Locale.US verilseydi 3.14 yazılırdı.

Çoktan Seçmeli · Biçimli Çıktı

Soru 17: Yanlış Yer Tutucu

System.out.printf("%d%n", 3.5); çalıştırılınca ne olur?

B: Biçim dizgisi derleyici için sıradan bir metindir; uyuşmazlık ancak çalışırken fark edilir. %d tam sayı tipleri ister, double için %f gerekir; printf dönüşüm yapmaz, istisna fırlatır.

Çoktan Seçmeli · Uygulamalar

Soru 18: Ortadaki Karakter

Metot, kelimenin ortadaki karakterini (çift uzunlukta ortadaki ikisinden soldakini) döndürür. orta("Java") ve orta("Giresun") ne döndürür, orta("") çağrısında ne olur?

static char orta(String kelime) {
  int uzunluk = kelime.length();
  int ortaIndex = uzunluk / 2;
  if (uzunluk % 2 == 0) {
    return kelime.charAt(ortaIndex - 1);
  } else {
    return kelime.charAt(ortaIndex);
  }
}

A: "Java" (J0 a1 v2 a3): uzunluk 4 çift, ortaIndex 2, charAt(1) = 'a'. "Giresun" (G0 i1 r2 e3 s4 u5 n6): uzunluk 7 tek, charAt(3) = 'e'. Boş dizgide uzunluk 0 çift sayılır ve charAt(-1) çağrılır: çalışma zamanı istisnası. Derleyici değerleri bilmez (D); Java'da "boş karakter" yoktur (B). Önlem: başta if (kelime.isEmpty()) denetimi.

Kod Yazma · Uygulamalar

Soru 19: Boşluk Sayma

int boslukSay(String metin) metodunu charAt ile yazın: metindeki boşluk karakterlerinin sayısını döndürsün.

  • boslukSay("Java ile nesne") (iki ardışık boşluk) kaçtır?
  • boslukSay(" a b ") ve boslukSay("") kaçtır?
  • metin.split(" ").length - 1 neden her zaman doğru sonucu vermez?
Cevabı göster
static int boslukSay(String metin) {
  int sayac = 0;
  for (int i = 0; i < metin.length(); i++) {
    if (metin.charAt(i) == ' ') {
      sayac++;
    }
  }
  return sayac;
}

Sonuçlar: 3, 3 ve 0. charAt bir char döndürür; tek tırnaklı ' ' ile == kullanılır.

split(" ") sondaki boş parçaları atar: " a b ".split(" ") → ["", "a", "b"], sonuç 3 − 1 = 2 olur (yanlış). İlk örnekte 3 doğru çıkar: yöntem tesadüfen tutar.

Kod Yazma · Uygulamalar

Soru 20: Palindrom Denetimi

boolean palindromMu(String s) metodunu yazın: büyük/küçük harf farkını ve harf olmayan karakterleri (boşluk, noktalama) yok saysın, yeni dizgi oluşturmadan iki indisle çalışsın.

  • "Ey Edip, Adana'da pide ye" → true
  • "Kayak" → true
  • "Java" → false
Cevabı göster
static boolean palindromMu(String s) {
  int i = 0, j = s.length() - 1;
  while (i < j) {
    char a = s.charAt(i), b = s.charAt(j);
    if (!Character.isLetter(a)) {
      i++;
    } else if (!Character.isLetter(b)) {
      j--;
    } else if (Character.toLowerCase(a)
               != Character.toLowerCase(b)) {
      return false;
    } else {
      i++;
      j--;
    }
  }
  return true;
}

Biri baştan biri sondan gelen iki indis; harf olmayan karakter atlanır. char ilkel tip olduğu için != ile karşılaştırılır. Üç örnek için çıktı: true, true, false. Ek dizgi oluşturulmaz; O(n).

Son

Bölüm 5: Dizgi: Çalışma Soruları
Konu anlatımı: Dizgi sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.