Java string, değişkenin ilk harfini büyük geri kalanları küçük yapma

Kuzemune

Femtopat
Katılım
10 Ocak 2021
Mesajlar
10
Daha fazla  
Cinsiyet
Erkek
Herkese merhaba.
HTML'den string hasta_il adında bir değişken okuyorum. Kullanıcı buraya ne girerse girsin örneğin; İstanbul, Ankara, Muş, Gaziantep, İzmir, Samsun vb. ilk harfini büyük geri kalan harflerin hepsini küçük yapmak istiyorum. Yardımcı olur musunuz?
 
Son düzenleyen: Moderatör:
[CODE lang="java" title="Code"]String sonuc = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1);[/CODE]

Bu şekilde String'i 2 parçaya ayırıp (ilk harfi ve geri kalanı şeklinde) tekrar birleştirerek yapabilirsin.
"istanbul" -> "İ" + "stanbul" = "İstanbul"
 
Java:
public static String capitalize(String source)
{
  return new StringBuilder().append((source.charAt(0) + "").toUpperCase()).append(source.substring(1).toLowerCase()).toString();
}

Apache commons lang'ı import ederek de yapabilirsiniz.

Java'daki String'ler immutable'dır bu yüzden + (concat) ile String birleştirmek belleği şişirir.
Java:
public class StringTest
{

  public static void main(String[] args)
  {
    long now = System.currentTimeMillis();
    strConcat();
    System.out.println("Concat elapsed " + (System.currentTimeMillis() - now) + " ms");

    now = System.currentTimeMillis();
    strBuild();
    System.out.println("StringBuilder elapsed " + (System.currentTimeMillis() - now) + " ms");
  }

  private static void strBuild()
  {
    StringBuilder s = new StringBuilder();
    for(int i=0;i<100000;i++)
      s.append("*");
  }

  private static void strConcat()
  {
    String s = "";
    for(int i=0;i<100000;i++)
      s+="*";
  }
}

Sonuç;
Kod:
Concat elapsed 4232 ms
StringBuilder elapsed 2 ms

1-2 String'i birleştirmede fark hissedilmiyor ancak sürekli tekrar eden bir döngüde fark ortada.
 
Son düzenleme:
Java:
    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter a string: ");
    String str = scanner.nextLine();
    String output = str.substring(0, 1).toUpperCase() + str.substring(1);
    System.out.println(output);

Başlık yanlış değilse Java'da istiyorsun. Yukarıdaki kod parçasından anlayabilirsin.
 
Yazilanlar genelde dogru olsa da ufak edge-case ler var.

1) Ilk harf buyuk, geri kalan kucuk dedigine gore string'in kalanini lowercase yapmalisiniz. Belki tamami buyuk harf geldi?

2) Case degistirme islemi default Locale uzerinden yapilir. Explicit bunu belirtmezseniz region'i farkli ayarlanmis cihazlarda calismlar. istanbul'u Istanbul diye yazar ( İstanbul yerine ).

- Eger kucuk harf geliyorsa String ve locale endisesi yoksa Apache StringUtils en iyisi.
StringUtils.capitilalize("bursa") %99 ihtimalle cozecek bu.

- Eger ben yazicam diyorsan da ve String buyuklu kucuklu gelecekse once hepsini lowercase(locale.tr) yapip sonra ilk harfini uppercase(locale.tr) yapabilirsin.

- Kotlin kullanin :) "bursa".capitalize() -> bu kadar. ( Kotlin capitalize metodu locale parametresi de aliyor opsiyonel olarak ve null check yapiyor )
 
Moderatör yazıyı düzenlemiş normalde büyüklü küçüklü ve arada boşluklu falan örnek yazmıştım.
Yazilanlar genelde dogru olsa da ufak edge-case ler var.

1) Ilk harf buyuk, geri kalan kucuk dedigine gore string'in kalanini lowercase yapmalisiniz. Belki tamami buyuk harf geldi?

2) Case degistirme islemi default Locale uzerinden yapilir. Explicit bunu belirtmezseniz region'i farkli ayarlanmis cihazlarda calismlar. istanbul'u Istanbul diye yazar ( İstanbul yerine ).

- Eger kucuk harf geliyorsa String ve locale endisesi yoksa Apache StringUtils en iyisi.
StringUtils.capitilalize("bursa") %99 ihtimalle cozecek bu.

- Eger ben yazicam diyorsan da ve String buyuklu kucuklu gelecekse once hepsini lowercase(locale.tr) yapip sonra ilk harfini uppercase(locale.tr) yapabilirsin.

- Kotlin kullanin :) "bursa".capitalize() -> bu kadar. ( Kotlin capitalize metodu locale parametresi de aliyor opsiyonel olarak ve null check yapiyor )
Evet moderatör sağ olsun yanlış yazılmış diye silmiş örneklerimi. Büyüklü küçüklü , boşluklu falan girebilir bunların hepsini düzeltecek. Şöyle bir kod kullandım ;
hasta_il = hasta_il.substring(0,1).toUpperCase()+hasta_il.substring(1).toLowerCase().replaceAll("\\s",""); Boşlukları siliyor ve ilk harf dışında her şeyi küçültüyor.
Moderatör yazıyı düzenlemiş normalde büyüklü küçüklü ve arada boşluklu falan örnek yazmıştım.

Evet moderatör sağ olsun yanlış yazılmış diye silmiş örneklerimi. Büyüklü küçüklü , boşluklu falan girebilir bunların hepsini düzeltecek. Şöyle bir kod kullandım ;
hasta_il = hasta_il.substring(0,1).toUpperCase()+hasta_il.substring(1).toLowerCase().replaceAll("\\s",""); Boşlukları siliyor ve ilk harf dışında her şeyi küçültüyor.
capitalize , capitalizefully dökümanlarını okumuştum ama koduma yedirememiştim bende üstteki gibi çözüm buldum :D
 
Moderatör yazıyı düzenlemiş normalde büyüklü küçüklü ve arada boşluklu falan örnek yazmıştım.

Evet moderatör sağ olsun yanlış yazılmış diye silmiş örneklerimi. Büyüklü küçüklü , boşluklu falan girebilir bunların hepsini düzeltecek. Şöyle bir kod kullandım ;
hasta_il = hasta_il.substring(0,1).toUpperCase()+hasta_il.substring(1).toLowerCase().replaceAll("\\s",""); Boşlukları siliyor ve ilk harf dışında her şeyi küçültüyor.

capitalize , capitalizefully dökümanlarını okumuştum ama koduma yedirememiştim bende üstteki gibi çözüm buldum :D
Eger sorununu cozuyorsa devam et bence, bu konuda cok fazla detay durum olusturulabilir. Programlama bulmacasi degil de gercek hayata dair bir is pesindesin gibi geldi bu mesajindan.

Ama senin yontem soyle bir stringi duzgun ceviremez:
Kod:
"  i s t A     n b u l   "

Cunku hem basinda bosluk var ( trim yapmiyorsun) ve de uppercase yaparken Locale vermiyorsun.

Bazen cok kurcalamadan duzgun calisan kodla devam etmek gerekiyor : )
 
Java:
String hasta_il = "aNkAra";

if (hasta_il.contains(" ") == true) {
    hasta_il = hasta_il.replace(" ", "");
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();
} else {
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();
}

@bitwise Bu şekilde yapılsa?
 
Son düzenleme:
Java:
String hasta_il = "aNkAra";

if (hasta_il.contains(" ") == true) {
    hasta_il = hasta_il.replace(" ", "");
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();
} else {
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();
}

@bitwise Bu şekilde yapılsa?
Calisir bu sekilde de. Ama ben bu kodu da review'dan gecirmezdim sahsen : ) Cunku sadece sehir isimleri icin calisir. Turkiye'de 2 kelimelik sehir ismi olmadigi icin ( "New York City" gibi ) calisacak. Ayni fonksiyonu ilce isimleri icin kullanamazsin, cunku 2 kelime arasindaki boslugu da replace ediyorsun. "fevzi cakmak bulvari" -> "Fevzicakmakbulvari" olacak.

Ilce/mahalle/bulvar isimleri icin ayri bir fonksiyon yazacaksan DRY prensibine aykiri davranmis olacagiz.

Bir de contains == true yapmana gerek yok; if - else icinde identical kod blogu varsa onlari bloga almana gerek yok, zira condition'a bagli degil demektir. Su sekilde sadelestirilebilir:

Java:
    String hasta_il = "aNkAra";
    if(hasta_il.contains(" ")){
      hasta_il = hasta_il.replace(" ", "");
    }
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();

String.replace() ilgili regex olmasa da calisir, onun icin contains check'i yapmana da gerek yok, gereksiz performans kaybi. ( replace kendi icinde contains checki yapiyor cunku )

Sonuc olarak su sekilde en sade halini aliyor:

Java:
    String hasta_il = "aNkAra";
    hasta_il = hasta_il.replace(" ", "");
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();

Tavsiyem Kotlin, "aNkAra".capitalize() yaziyorsun ve bitiyor.
 
Calisir bu sekilde de. Ama ben bu kodu da review'dan gecirmezdim sahsen : ) Cunku sadece sehir isimleri icin calisir. Turkiye'de 2 kelimelik sehir ismi olmadigi icin ( "New York City" gibi ) calisacak. Ayni fonksiyonu ilce isimleri icin kullanamazsin, cunku 2 kelime arasindaki boslugu da replace ediyorsun. "fevzi cakmak bulvari" -> "Fevzicakmakbulvari" olacak.

Ilce/mahalle/bulvar isimleri icin ayri bir fonksiyon yazacaksan DRY prensibine aykiri davranmis olacagiz.

Bir de contains == true yapmana gerek yok; if - else icinde identical kod blogu varsa onlari bloga almana gerek yok, zira condition'a bagli degil demektir. Su sekilde sadelestirilebilir:

Java:
    String hasta_il = "aNkAra";
    if(hasta_il.contains(" ")){
      hasta_il = hasta_il.replace(" ", "");
    }
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();

String.replace() ilgili regex olmasa da calisir, onun icin contains check'i yapmana da gerek yok, gereksiz performans kaybi. ( replace kendi icinde contains checki yapiyor cunku )

Sonuc olarak su sekilde en sade halini aliyor:

Java:
    String hasta_il = "aNkAra";
    hasta_il = hasta_il.replace(" ", "");
    hasta_il = hasta_il.substring(0, 1).toUpperCase() + hasta_il.substring(1).toLowerCase();

Tavsiyem Kotlin, "aNkAra".capitalize() yaziyorsun ve bitiyor.
Cevabınız için teşekkür ederim, eğer boş vaktiniz olursa Java ile yapmayı deneyebilir misiniz rica etsem? Çünkü bahsettiğiniz şeylerden birini yapsam mesela biri patlıyor.
 
Uyarı! Bu konu 5 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı