İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

StringTokenizer ve StringBuffer

Java'da String işlemlerini kolaylaştırmak için çok çeşitli class'lar bulunur. Bunlar arasında bir string'i parçalara ayırmay ayarayan StringTokenizer ve string'leri birleştirmeye yarayan StringBuffer en fazla kullanılanlarındandır.

StringTokenizer

Bir string'i belli karakterlere göre parçalamak için StringTokenizer class'ı kullanılır. Her bir parçaya 'token' denir. Sınırlayıcı karakterlerin her biri 'delimiter' diye adlandırılır. StringTokenizer, verilen stringi verilen karakterlere göre parçalar ve sırayla verir.Çalışma mantığı token'ları bir dizi olarak verme şeklinde olmaz. Token'lara erişim sırayla gerçekleşirilir. Bir tümce içinde geçen sözcükleri bulmaya yarayan bir kod parçası yazalım.

String sentence="Java is a simple, object-oriented, distributed, interpreted,"
	+" robust, secure,architecture-neutral, portable, multithreaded, dynamic,"
	+" buzzword-compliant, general-purpose programming language.";
String delims=" ;,.-";
StringTokenizer tokenizer=new StringTokenizer(sentence,delims);
while(tokenizer.hasMoreTokens()){
	String token=tokenizer.nextToken();
	System.out.println(token);
}

StringTokenizer, parçalayacağı string'i ve sınırlayıcı karakterleri constructor'da ister. Delimiter'ler bir string biçiminde birleştirilerek verilir. Bu sadece çalışma kolaylığı sağlamak içindir, yoksa verilen string'deki her karakter ayrı ayrı düşünülür. Whitespace (boşluk) karakterleri aynen, 'yeni satır' (new line) gibi karakterler '\' ile kaçılarak belirtilir.

StringTokenizer Enumeration interface'ini implement eder. Başka bir deyişle StringTokenizer da Enumeration olarak erişilebilir.

StringTokenizer tokenizer2=new StringTokenizer(sentence,delims);
while(tokenizer2.hasMoreElements()){
	String token=(String)tokenizer2.nextElement();
	System.out.println(token);
}

Burada hasMoreTokens() ve nextToken() yerine hasMoreElements() ve nextElement() kullanılmıştır. Ancak Enumeration string değil object tipiyle çalıştığı için token'ın string olarak kullanılabilmesi için cast edilmesi gerekir.

Bazı durumlarda delimiter'ler de gerekebilir. StringTokenizer constructor'unda parametre olarak 'returnDelims' değerini alır. Default'u false olan bu değer true girilirse, token'larını yanısıra delimiter'lar da döner sonuçta.

boolean returnDelims=true;
StringTokenizer tokenizer3=new StringTokenizer(sentence,delims,returnDelims);
while(tokenizer3.hasMoreTokens()){
	String token=tokenizer3.nextToken();
	System.out.println(token);
}

Göster Gizle Kopar Satır Gizle Satır Göster

  1 import java.util.*;
  2 public class StringTokenizerTest {
  3   public static void main(String[] args){
  4     String sentence="Java is a simple, object-oriented, distributed, interpreted,"
  5       +" robust, secure,architecture-neutral, portable, multithreaded, dynamic,"
  6       +" buzzword-compliant, general-purpose programming language.";
  7     StringTokenizer tokenizer=new StringTokenizer(sentence);
  8     while(tokenizer.hasMoreTokens()){
  9       String token=tokenizer.nextToken();
 10       System.out.println(token);
 11     }  
 12     String delims=" ;,.-\n\r\t";
 13     StringTokenizer tokenizer2=new StringTokenizer(sentence,delims);
 14     while(tokenizer2.hasMoreElements()){
 15       String token=(String)tokenizer2.nextElement();
 16       System.out.println(token);
 17     }
 18     boolean returnDelims=true;
 19     StringTokenizer tokenizer3=new StringTokenizer(sentence,delims,returnDelims);
 20     while(tokenizer3.hasMoreTokens()){
 21       String token=tokenizer3.nextToken();
 22       System.out.println(token);
 23     }
 24   }
 25 }

StringBuffer

Java'da metin biçimindeki verileri tutmak için String class'ı kullanılır. Bu class içerisinde bir char[] (karakter dizisi) tutar. Bu değişmez. Dolayısıyle birden fazla string'in birleştirlmesi, bir string'in içersinden bir bölümünün çıkarılması gibi işlemler yeni bir string üretilmesi şeklinde olur. Bu işlemler için aslında programcı bilmese de StringBuffer adlı class kullanılır. Örneğin

x = "a" + 4 + "c" 

şeklindeki kod

 x = new StringBuffer().append("a").append(4).append("c").toString()

şeklindeki kodun kısa yazılışıdır. Ancak işlem tek ifade içerisinde olmadığı durumlarda, bir çok String nesnesi yaratılır. Çünkü string içerisindeki değerler sabittir. Bir karakter bile eklense yeni bir string yaratılmış olur.

x+="a";
x+="b";

gibi basit ifadelerde bile çok sayıda string nesnesi yaratılır. Dolayısıyla çok fazla stirng operasyonu içeren kodların Stirng class'ını kullanması performans açısından kayba yol açar. O yüzden bu durumlarda StringBuffer kullanmak faydalı olabilir. Bu nesne de bir char[] (karakter dizisi) tutar ancak bu eklem çıkarma yapıldıkça değişir, gerektiğinde uzar. StringBuffer nesnesi

StringBuffer buffer=new StringBuffer();

şeklinde boş olarak,

StringBuffer buffer=new StringBuffer("initial"); 

da olduğu gibi başlangıçta bir değer vererek olabilir. Bir string eklemek için

buffer.append("mystring"); 

şeklinde bir ifade gerekir. Buradaki append() methodu temel tipler ve object için oveload edilmiştir (her biri için ayrı bir method append() yazılmıştır). Karakter veya sayı eklemek için, örneğin

buffer.append('A');
buffer.append(2.4);

ifadeleri yeterlidir. Bu append() methodu kolaylık olsun diye StringBuffer'ın kendisini geri döndürmektedir.

buffer.append("first").append("second");

şeklinde bir ifade yazılabilir. İlk append method'undan buffer döndüğü için ikinci bir append yazılabilmektedir. StringBuffer'ın ortasında bir yere metin eklemek için

buffer.insert(5,"xxx");

şeklinde bir ifade gereklidir. Burada "xxx" 5'. karakterden itibaraen araya sokulur. Belli bir kısmı değiştirmek için

buffer.replace(3,5,"yyy");

şeklinde bir ifade yeterlidir. Burada replace() method'uyla İndisi 3'ten başlayıp 5'e kadar giden bölge silinir yerine "yyy" konur. StringBuffer'la yapılacak işler bittikten sonra String class'ına çevirmek gerektiğinde

String string=buffer.toString();

şeklinde toString() method'u kullanılır. Genellikle üzerinde değişiklikler yapılacak string önce StringBuffer class'ına constructor'da verilir. En son işlemler bittikten sonra tekrar toString methodu'yla string'e döndürülür.

Göster Gizle Kopar Satır Gizle Satır Göster
  1 public class StringBufferTest {
  2   public static void main(String[] args){
  3     StringBuffer buffer=new StringBuffer();
  4     buffer.append("One");
  5     buffer.append("Two");
  6     buffer.append("Three");
  7     buffer.append("Four").append("Five");
  8     buffer.append('S').append('i').append('x');
  9     char[] chars= new char[]{'S','e','v','e','n'};
 10     buffer.append(chars);
 11     buffer.insert(6,"-");
 12     buffer.replace(12,16,"-4-");
 13     String string=buffer.toString();
 14     System.out.println(string);
 15     String sub=buffer.substring(19,22);
 16     System.out.println(sub);
 17   }
 18 }

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır