Bölüm 11: Dizgiler
Giriş
Öğrenme Çıktıları
String ve char ayrımını açıklamak.
İndis ve temel metotları kullanmak.
İçerik ve referans karşılaştırmasını ayırmak.
printf ile biçimli metin üretmek.
Temeller
String Nedir?
String, karakter dizisini temsil edenjava.langsınıfıdır (import gerekmez).- Dizgi sabitleri çift tırnakla (
"Tarkan"),chartek tırnakla ('T') yazılır. Stringilkel tip değil, değiştirilemez bir nesnedir; değişken nesnenin referansını tutar.
Temeller
String Oluşturma
String ad = "Tarkan"; String bos = ""; String kopya = new String(ad); String yok = null;
- Çoğunlukla
newkullanmadan dizgi sabiti tercih edilir. ""uzunluğu 0 olan gerçek bir nesnedir;nullise hiçbir nesneyi göstermez (yok.length()→NullPointerException).
Temeller
Değiştirilemezlik
- String oluşturulduktan sonra içeriği değişmez.
- Birleştirme ve dönüştürme işlemleri yeni String üretir; eski nesne olduğu gibi kalır.
- Sonucu kullanmak için dönen değer bir değişkene atanmalıdır.
- Hiçbir değişkenin göstermediği nesneyi çöp toplayıcı (garbage collector) temizler.
String s = "Merhaba";
s = s + "!"; → yeni nesne; ok ona taşındı, eski nesne aynı.
Temeller · Kodu adım adım çalıştır
Değiştirilemezlik: toUpperCase()
dil, havuzdaki "java" nesnesini gösterir.
toUpperCase() yeni bir "JAVA" nesnesi üretir; ama sonuç hiçbir değişkene atanmadı → kaybolur. dil hâlâ eski nesnede.
Eski nesne değişmediği için java yazar.
Bu kez dönen yeni nesne dil'e atanır: ok yeni nesneye taşınır. "java" nesnesi yine aynen durur.
JAVA yazar. Değişen nesne değil, değişkenin gösterdiği yerdir.
String dil = "java"; dil.toUpperCase(); System.out.println(dil); // java dil = dil.toUpperCase(); System.out.println(dil); // JAVA
İndis
İndisleme
- İlk karakter 0, son karakter length() − 1 indisindedir;
length()bir metottur (dizilerdekilengthalanından farklı). charAt(i)o konumdakichardeğerini döndürür;charAt(7)→StringIndexOutOfBoundsException.
Metotlar · Kodu adım adım çalıştır
Temel Metotlar
16 karakterlik dizgi (boşluk da bir karakterdir: indis 4).
length() → 16; indisler 0 … 15.
indexOf aranan metnin ilk karakterinin indisini verir → 5 (yoksa −1).
substring(5, 16): 5 dahil, 16 hariç → 11 karakter: "Programlama".
contains("Java") → true. Hiçbir metot s'yi değiştirmedi.
Sonuçlar birleştirilip yazdırılır.
String s = "Java Programlama"; int uzunluk = s.length(); int konum = s.indexOf("Programlama"); String alt = s.substring(5, 16); boolean icerir = s.contains("Java"); System.out.println(alt + " " + konum);
Metotlar
Sık String Metotları
| Metot | Sonuç |
|---|---|
| length() | Karakter/kod birimi sayısı |
| charAt(i) | i konumundaki char |
| substring(a,b) | a dahil, b hariç alt dizgi |
| indexOf(x) | İlk konum veya -1 |
| toLowerCase() | Küçük harfli yeni String |
| trim() / strip() | Kenar boşlukları kaldırılmış yeni String |
Metotlar · Kodu adım adım çalıştır
split ve replace Adım Adım
split(",") metni virgüllerde keser: "a", "b", "", "c". Ardışık iki virgülün arası boş dizgi olur ve dizide yer alır.
Arrays.toString(p) → [a, b, , c], p.length → 4. (Dizinin sonundaki boş parçalar atılır: "a,b,,".split(",") yalnızca 2 parça verir.)
s = "ali veli": 8 karakter, 3. indis boşluk.
replace('l', 'L') her 'l' karakterini 'L' yapar (indis 1 ve 6) ve yeni bir String döndürür; s ise bu satırda değişmez.
t yazdırılır: aLi veLi.
s hâlâ ali veli: String değiştirilemezdir, sonuç ancak dönen değerde bulunur.
String[] p = "a,b,,c".split(",");
System.out.println(Arrays.toString(p) + " " + p.length); // [a, b, , c] 4
String s = "ali veli";
String t = s.replace('l', 'L');
System.out.println(t); // aLi veLi
System.out.println(s); // ali veliMetotlar
replace, replaceAll, join, valueOf, format
| Çağrı | Sonuç |
|---|---|
"banana".replace('a', 'o') | bonono |
"banana".replace("an", "AN") | bANANa |
"a1b22c333".replaceAll("[0-9]+", "#") | a#b#c# |
"a1b22c333".replaceFirst("[0-9]+", "#") | a#b22c333 |
"Ada Can Ece".replaceAll(" +", " ") | Ada Can Ece |
String.join(", ", "Ada", "Can", "Ece") | Ada, Can, Ece |
String.valueOf(3.5) / String.valueOf(new char[]{'h','i'}) | 3.5 / hi |
String.format(Locale.US, "%.2f", 3.14159) | 3.14 |
String.format(Locale.US, "%5d|%-5d|%05d", 42, 42, 42) | 42|42 |00042 |
String.format(Locale.US, "%,d", 1234567) | 1,234,567 |
replace düz metin, replaceAll düzenli ifade arar; hepsi yeni String döndürür. Yerel ayar verilmezse %.2f Türkçe ayarlı bilgisayarda 3,14 yazar.
Metotlar
Alt Dizgi Sınırları: s = "PROGRAM"
İndisler karakterlerin arasındaki çizgiler gibi düşünülebilir: 0 ile 3 arası "PRO". Uzunluk = 3 − 0.
Bitiş length() = 7 olabilir: son karakter dahil edilir.
Tek parametreli sürüm: başlangıçtan sona kadar.
Başlangıç = bitiş → boş dizgi "" (hata değil).
Bitiş > length() ya da başlangıç > bitiş → çalışma zamanı hatası.
substring(a, b): a dahil, b hariç; sonuç uzunluğu b − a.- Geçerli aralık: 0 ≤ a ≤ b ≤ length().
Metotlar · Kodu adım adım çalıştır
Uygulama: E-postayı Parçalama
11 karakterlik e-posta adresi; kullanıcı adını ve alan adını ayıracağız.
indexOf('@') → 3: ayırıcının konumu.
substring(0, 3): 0 dahil, 3 (@) hariç → "ali".
substring(4): @'den sonraki karakterden sona kadar → "gru.edu".
charAt(0) bir char döndürür: 'a' (tek tırnak).
Parçalar birleştirilerek yazdırılır.
Character.toUpperCase char'ı büyük harfe çevirir → A. eposta hiç değişmedi.
String eposta = "ali@gru.edu"; int at = eposta.indexOf('@'); String kullanici = eposta.substring(0, at); String alan = eposta.substring(at + 1); char ilk = eposta.charAt(0); System.out.println(kullanici + " / " + alan); System.out.println(Character.toUpperCase(ilk));
Karşılaştırma · Kodu adım adım çalıştır
== ile equals Farkı
Sabit "Giresun" dizgi havuzuna konur; a onu gösterir.
new String(...) içerik aynı olsa da heap'te ayrı bir nesne açar.
Aynı sabit tekrar yazıldı: havuzdaki mevcut nesne paylaşılır → c ile a aynı oku taşır.
a == b: iki ok farklı nesneye gidiyor → false (içeriğe bakılmaz).
a == c: iki ok aynı nesnede → true.
equals karakterleri tek tek karşılaştırır: G=G, i=i, … → true. İçerik için daima equals.
String a = "Giresun"; String b = new String("Giresun"); String c = "Giresun"; System.out.println(a == b); // false System.out.println(a == c); // true System.out.println(a.equals(b)); // true
Karşılaştırma
Karşılaştırma Metotları
| Metot | Amaç | Örnek |
|---|---|---|
equals | İçerik eşitliği | "abc".equals("abc") → true |
equalsIgnoreCase | Büyük-küçük harfi yok sayan eşitlik | "Java".equalsIgnoreCase("JAVA") → true |
startsWith | Belirli metinle başlama | "Giresun".startsWith("Gir") → true |
endsWith | Belirli metinle bitme | "Giresun".endsWith("sun") → true |
compareTo | Sözlüksel sıra: <0, 0, >0 | "elma".compareTo("armut") → pozitif |
compareTo Unicode değerlerine göre çalışır: büyük harfler küçüklerden önce gelir ve Türkçe harfler (ç, ğ, ı, ö, ş, ü) alfabe sırasına uymayabilir.
Karşılaştırma · Kodu adım adım çalıştır
compareTo: Karakter ve Uzunluk Farkı
Önce x = "elma" (4 karakter). Karşılaştırma bu karakterlerin Unicode kodlarına göre yapılır.
y = "armut" (5 karakter). Sıradaki satırda x.compareTo(y) hesaplanacak.
İlk farklı konum 0: 'e' - 'a' = 101 - 97 = 4. Pozitif: "elma" sözlükte "armut"tan sonra gelir.
k = "kedi" (4 karakter). Şimdi bir dizgi diğerinin başlangıcıysa ne olduğuna bakalım.
k.compareTo("kediler"): ilk 4 karakter aynı ve "kedi" bitiyor; sonuç uzunluk farkıdır.
4 - 7 = -3: kısa olan "kedi" önce gelir. Kural: farklı karakter varsa karakter farkı, yoksa uzunluk farkı.
String x = "elma"; String y = "armut"; System.out.println(x.compareTo(y)); // 4 String k = "kedi"; System.out.println(k.compareTo("kediler")); // -3
Karşılaştırma
Türkçe Karakter ve Locale
| Çağrı (tr = Locale.forLanguageTag("tr")) | Sonuç |
|---|---|
"TITLE".toLowerCase(Locale.ENGLISH) | title |
"TITLE".toLowerCase(Locale.forLanguageTag("tr")) | tıtle |
"i".toUpperCase(tr) | İ |
"i".toUpperCase(Locale.ENGLISH) | I |
"I".toLowerCase(tr) | ı |
"ISPARTA".toLowerCase(tr) | ısparta |
"ısparta".toUpperCase(tr) | ISPARTA |
- Parametresiz
toLowerCase()makinenin varsayılan diline bağlıdır: aynı kod başka bilgisayarda başka sonuç verebilir. - Anahtar sözcük, dosya uzantısı gibi teknik metinde
Locale.ENGLISH, Türkçe metindeLocale.forLanguageTag("tr")verilir. "TITLE".toLowerCase(tr).equals("title")→false;"title".equalsIgnoreCase("TITLE")→true.
Bellek
Dizgi Havuzu
- Aynı dizgi sabitleri havuzdaki tek bir nesneyi paylaşır (bellek tasarrufu; değiştirilemezlik sayesinde güvenli).
new String(...)her zaman ayrı nesne oluşturur.- Bir String'in havuzdan mı geldiği koda bakınca her zaman anlaşılmaz; bu yüzden içerik karşılaştırmasında
==değilequalskullanılır.
Bellek
Sabit Birleştirme ve intern
String a = "a", b = "b"; String r = a + b; final String f = "a"; System.out.println(("a" + "b") == "ab"); // true System.out.println((f + "b") == "ab"); // true System.out.println(r == "ab"); // false System.out.println(r.equals("ab")); // true System.out.println(r.intern() == "ab"); // true
Sabit ifadeleri ("a" + "b", final değişken) derleyici birleştirir; sonuç havuzdaki "ab"'dir. a + b çalışma zamanında yeni nesne üretir; intern() havuzdaki nesneyi verir.
String x = null; iken "sabit".equals(x) → false, ama x.equals("sabit") → NullPointerException. Bu yüzden sabit değer sola yazılır.
Girdi
Scanner ile Metin Girdisi
import java.util.Scanner; // ... Scanner klavye = new Scanner(System.in); String kelime = klavye.next(); klavye.nextLine(); String satir = klavye.nextLine();
next()bir kelime okur: baştaki boşlukları atlar, ilk boşlukta/satır sonunda durur.nextLine()satır sonuna (⏎) kadar her şeyi okur ve ⏎'ı tüketir.next()veyanextInt()sonrası tamponda kalan ⏎, birnextLine()ile ayrıca tüketilmelidir.
Girdi · Kodu adım adım çalıştır
Kod İzleme: next() ve nextLine()
Scanner klavye akışına bağlanır; tampon şimdilik boş.
next() okuyacak bir şey bulamaz ve bekler. Kullanıcı Ada yazıp Enter'a basar → tampona "Ada⏎" girer.
next() boşluk/satır sonuna kadar okur → "Ada". ⏎ tamponda kalır.
nextLine() ⏎'a kadar okur → "" (boş) döner ve ⏎'ı tüketir. Artık tampon temiz.
Tampon boş → nextLine() bekler. Kullanıcı Giresun Merkez yazıp Enter'a basar.
Satırın tamamı (boşluk dahil) okunur → "Giresun Merkez"; ⏎ tüketilir ama sonuca eklenmez.
İki değer yazdırılır.
Scanner klavye = new Scanner(System.in);
String kelime = klavye.next();
klavye.nextLine();
String satir = klavye.nextLine();
System.out.println(kelime + " | " + satir);3. satır olmasaydı 4. satırdaki nextLine() kalan ⏎'ı okuyup hemen boş satır döndürürdü.
Performans
Birleştirme ve StringBuilder
+az sayıda dizgi birleştirme için okunaklıdır.- Döngüde
s = s + xher turda yeni String oluşturur ve eskiyi kopyalar. StringBuilderdeğiştirilebilir bir tampondur:appendaynı nesneye ekler.toString()tamponun o anki içeriğinden son String'i üretir.
Performans · Kodu adım adım çalıştır
Kod İzleme: StringBuilder ile Birleştirme
Boş, değiştirilebilir bir tampon oluşturulur.
1 <= 3 → true
append(1) ve append(' ') aynı nesneye ekler (yeni String yok) → "1 ".
i++ → 2 <= 3 → true
append(2) ve append(' ') aynı nesneye ekler (yeni String yok) → "1 2 ".
i++ → 3 <= 3 → true
append(3) ve append(' ') aynı nesneye ekler (yeni String yok) → "1 2 3 ".
i++ → 4 <= 3 → false: döngü biter.
toString() tampondan tek bir String üretir.
Sondaki boşluk görünsün diye | eklendi.
StringBuilder metin = new StringBuilder(); for (int i = 1; i <= 3; i++) { metin.append(i).append(' '); } String sonuc = metin.toString(); System.out.println(sonuc + "|");
Uygulamalar · Kodu adım adım çalıştır
Dizgiyi Ters Çevirme
Dizgiyi sondan başa doğru okuyup yeni bir dizgiye ekleyeceğiz.
Boş dizgiyle başlanır.
i = 3: s.charAt(3) = 'a' eklenir → "a" (her += yeni String üretir).
i = 2: s.charAt(2) = 'v' eklenir → "av" (her += yeni String üretir).
i = 1: s.charAt(1) = 'a' eklenir → "ava" (her += yeni String üretir).
i = 0: s.charAt(0) = 'J' eklenir → "avaJ" (her += yeni String üretir).
i = −1 → döngü biter; sonuç yazdırılır.
Kısa yol: StringBuilder'ın hazır reverse() metodu aynı sonucu verir.
İki yöntem de aynı çıktıyı üretir; s hiç değişmedi.
String s = "Java"; String ters = ""; for (int i = s.length() - 1; i >= 0; i--) ters += s.charAt(i); System.out.println(ters); String t2 = new StringBuilder(s).reverse() .toString(); System.out.println(t2);
Uygulamalar · Kodu adım adım çalıştır
Palindrom: Harf Büyüklüğü ve Boşluk Yok Sayılarak
Cümle büyük harf ve boşluk içeriyor; doğrudan karşılaştırırsak 'E' ≠ 'e' olur.
toLowerCase() ve replace(" ", "") → "eyedipadanadapideye" (19 karakter).
İki uç işaretçi: sol = 0, sag = 18. Aksi kanıtlanana kadar palindrom = true.
'e' ile 'e' → eşit, içe doğru ilerlenir.
'y' ile 'y' → eşit, içe doğru ilerlenir.
'e' ile 'e' → eşit, içe doğru ilerlenir.
'd' ile 'd' → eşit, içe doğru ilerlenir.
'i' ile 'i' → eşit, içe doğru ilerlenir.
'p' ile 'p' → eşit, içe doğru ilerlenir.
'a' ile 'a' → eşit, içe doğru ilerlenir.
'd' ile 'd' → eşit, içe doğru ilerlenir.
'a' ile 'a' → eşit, içe doğru ilerlenir.
sol = 9, sag = 9: işaretçiler buluştu, tüm çiftler eşit → true.
String cumle = "Ey Edip Adanada pide ye";
String t = cumle.toLowerCase().replace(" ", "");
int sol = 0, sag = t.length() - 1;
boolean palindrom = true;
while (sol < sag && palindrom) {
if (t.charAt(sol) != t.charAt(sag))
palindrom = false;
sol++; sag--;
}
System.out.println(palindrom);Uygulamalar · Kodu adım adım çalıştır
Sesli Harf Sayma
Önce hepsi küçük harfe çevrilir; sesliler dizgisi Türkçe sesli harfleri tutar.
'm': indexOf → -1 → sesli değil.
'e': indexOf → 1 ≥ 0 → sesli, sayac = 1.
'r': indexOf → -1 → sesli değil.
'h': indexOf → -1 → sesli değil.
'a': indexOf → 0 ≥ 0 → sesli, sayac = 2.
'b': indexOf → -1 → sesli değil.
'a': indexOf → 0 ≥ 0 → sesli, sayac = 3.
'␣': indexOf → -1 → sesli değil.
'd': indexOf → -1 → sesli değil.
'ü': indexOf → 7 ≥ 0 → sesli, sayac = 4.
'n': indexOf → -1 → sesli değil.
'y': indexOf → -1 → sesli değil.
'a': indexOf → 0 ≥ 0 → sesli, sayac = 5.
13 karakter tarandı: 5 sesli harf.
String s = "Merhaba Dünya".toLowerCase(); String sesliler = "aeıioöuü"; int sayac = 0; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (sesliler.indexOf(c) >= 0) sayac++; } System.out.println(sayac);
Uygulamalar · Kodu adım adım çalıştır
Kelime Sayma (boşluk geçişleri)
Kelime = boşluk olmayan karakterlerin kesintisiz dizisi. Boşluktan harfe geçişleri sayacağız.
'A' harf ve kelime dışındaydık → yeni kelime: kelime = 1.
'l' aynı kelimenin devamı.
'i' aynı kelimenin devamı.
Boşluk → kelime dışına çıkıldı.
Yine boşluk (çift boşluk) → sayılmaz.
'a' harf ve kelime dışındaydık → yeni kelime: kelime = 2.
't' aynı kelimenin devamı.
'a' aynı kelimenin devamı.
Boşluk → kelime dışına çıkıldı.
'b' harf ve kelime dışındaydık → yeni kelime: kelime = 3.
'a' aynı kelimenin devamı.
'k' aynı kelimenin devamı.
Sonuç 3. Kısa yol: metin.trim().split("\\s+").length (yalnızca boş olmayan metin için; boş metinde sonuç 0 değil 1 çıkar, önce isBlank() ile denetlenir).
String metin = "Ali ata bak"; int kelime = 0; boolean icinde = false; for (int i = 0; i < metin.length(); i++) { char c = metin.charAt(i); if (c != ' ' && !icinde) { kelime++; icinde = true; } else if (c == ' ') icinde = false; } System.out.println(kelime);
Uygulamalar · Kodu adım adım çalıştır
Karakter Frekansı (int[26])
26 hücreli sayaç: 'a' → 0, 'b' → 1, … Harfin indisi c - 'a' ile bulunur (char'lar sayıdır).
'k' - 'a' = 107 − 97 = 10 → frekans[10] = 1.
'a' - 'a' = 97 − 97 = 0 → frekans[0] = 1.
'v' - 'a' = 118 − 97 = 21 → frekans[21] = 1.
'a' - 'a' = 97 − 97 = 0 → frekans[0] = 2.
'k' - 'a' = 107 − 97 = 10 → frekans[10] = 2.
k = 0: frekans > 0 → (char) ('a' + 0) = 'a' yazdırılır.
k = 10: frekans > 0 → (char) ('a' + 10) = 'k' yazdırılır.
k = 21: frekans > 0 → (char) ('a' + 21) = 'v' yazdırılır. Tablo yalnızca a–z içindir; ç, ğ, ı, ö, ş, ü için ayrı bir düzen gerekir.
String s = "kavak"; int[] frekans = new int[26]; for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); frekans[c - 'a']++; } for (int k = 0; k < 26; k++) if (frekans[k] > 0) System.out.println((char) ('a' + k) + ": " + frekans[k]);
Uygulamalar · Kodu adım adım çalıştır
Sezar Şifreleme ve Çözme
Her harf alfabede 3 ileri kaydırılır. Sonuç StringBuilder'da biriktirilir.
'y': (24 + 3) % 26 = 1 → 'b' (26'yı aştı, % 26 başa sardı).
'a': (0 + 3) % 26 = 3 → 'd'.
'z': (25 + 3) % 26 = 2 → 'c' (26'yı aştı, % 26 başa sardı).
'i': (8 + 3) % 26 = 11 → 'l'.
'l': (11 + 3) % 26 = 14 → 'o'.
'i': (8 + 3) % 26 = 11 → 'l'.
'm': (12 + 3) % 26 = 15 → 'p'.
Şifreli metin bdclolp. Çözme: aynı döngüde kaydir yerine 26 - kaydir kullanılır → "yazilim".
String metin = "yazilim"; int kaydir = 3; StringBuilder sifreli = new StringBuilder(); for (int i = 0; i < metin.length(); i++) { char c = metin.charAt(i); int yer = (c - 'a' + kaydir) % 26; char yeni = (char) ('a' + yer); sifreli.append(yeni); } System.out.println(sifreli);
Biçimleme
printf ile Biçimleme
String ad = "Java"; int adet = 3; double fiyat = 17.5; System.out.printf("%-8s %3d %7.2f%n", ad, adet, fiyat);
%-8s ← ad: "Java" 8 hücreye sola yaslanır, kalan 4 hücre boşluk.
%3d ← adet: 3 tam sayısı 3 hücreye sağa yaslanır.
%7.2f ← fiyat: 2 ondalıkla "17.50" (5 karakter) 7 hücreye sağa yaslanır.
%n satır sonu ekler. Biçim belirteçleri argümanlarla sırayla eşleşir; tip uyuşmazsa hata oluşur.
%s metin, %d tam sayı, %f kayan noktalı sayı. Türkçe yerel ayarlı bilgisayarda %.2f ondalık ayırıcı olarak virgül basabilir (17,50).
Temeller
Unicode ve Metin
- String, UTF-16 kod birimlerinden (char) oluşur; Türkçe harfler tek char'a sığar.
- Bazı görünür karakterler (emoji, bazı simgeler) iki char ya da birden fazla Unicode kod noktası içerir.
- Bu yüzden kullanıcıya görünen karakter sayısı için
length()her durumda yeterli değildir.
Özet
Bölüm Özeti
String nesnesi değiştirilemez; toUpperCase, +, substring yeni nesne döndürür.
0 … length() − 1; substring(a, b): a dahil b hariç, uzunluk b − a.
İçerik için equals, sıra için compareTo; == yalnızca referansı karşılaştırır.
next kelime, nextLine satır okur; yoğun birleştirmede StringBuilder, biçim için printf.
Özet
Kontrol Soruları
- String neden değiştirilemez olarak adlandırılır?
- substring başlangıç ve bitiş sınırlarını nasıl kullanır?
==ileequalsarasındaki fark nedir?- next ve nextLine nasıl ayrılır?
- Döngü içinde neden StringBuilder tercih edilebilir?
Cevaplar
- Oluşturulduktan sonra karakterleri değiştirilemez; her “değişiklik” yeni bir nesne üretir.
- Başlangıç dahil, bitiş hariç; sonuç uzunluğu bitiş − başlangıç.
==iki değişkenin aynı nesneyi gösterip göstermediğine,equalskarakter içeriğine bakar.- next boşlukta/satır sonunda durur ve ⏎'ı tamponda bırakır; nextLine satırın kalanını okur ve ⏎'ı tüketir.
- Her turda yeni String oluşturup kopyalamak yerine tek bir tampona ekler.
Özet
Alıştırmalar
- Bir cümledeki büyük harf, küçük harf, rakam ve boşluk sayılarını ayrı ayrı bulun.
- Bir kelimenin anagram olup olmadığını (ör. "elma" – "alem") karakter frekanslarıyla kontrol edin.
- Kullanıcının girdiği ad-soyadı "Soyad, Ad" biçiminde ve soyadı büyük harfle yazdırın.
- Bir cümledeki en uzun kelimeyi bulun (
splitile). - Sezar şifresini büyük harfleri de (A–Z) destekleyecek şekilde genişletin; diğer karakterler aynen kalsın.
replacekullanmadan bir dizgideki tüm boşlukları silen kodu StringBuilder ile yazın.
Özet
Kaynaklar
- Deitel ve Deitel, Java: How to Program, Early Objects, 11. baskı, Pearson, 2018.
- Liang, Introduction to Java Programming and Data Structures, 13. baskı, Pearson, 2024.
- Oracle, The Java Tutorials: Strings, The StringBuilder Class.
- Oracle, Java SE 21 API: String, StringBuilder.
- Sedgewick ve Wayne, Computer Science: An Interdisciplinary Approach, Addison-Wesley, 2016: 3.1 Using Data Types.
- Unicode Consortium, The Unicode Standard.