Pure Java – 66 Tokenizing & Formatting

Merhaba Arkadaslar,
Bu bolumde tokenizing ve formatting konusundan bahsedecegim. Bu yazi ile birlikte bolum 6 sonu olacak insallah.

Tokenizing

Token , simge/sembol/jeton gibi anlamlara gelmektedir. Tokenizing tan kastimiz , buyuk bir icerigi/contenti ufak ufak parcalara bolmektir.Peki bu parcalara neye gore ayiracagiz ? Genelde virgul(,) nokta(.) gibi karakterlere gore ayrim yapilir bunlara delimiter(ayirici/sinirlayici) denilir.

Tokenizing islemini java.lang.String , java.util.Scanner, java.lang.StringTokenizer siniflari yardimi ile yapabiliriz.
java.lang.String sinifinda yer alan split metodunu kullanabiliriz.

public class StringSplitTest {
	public static void main(String[] args) {
		String content = "name1,name2,name3,name4";

		String[] names = content.split(",");
		for (String s : names) {
			System.out.println(s);
		}

		content = "name1,name2:name3:name4.name5@name6";
		System.out.println("virgul - iki nokta-nokta- @");
		names = content.split(",|:|\\.|@");
		// onceki yazida isledigimiz gibi ,birden fazla delimiter kullanmak icin
		// veya karakterini kullaniriz.
		// benzer sekilde noktayi kullanmak icin kacis karakteriyle kullanmamiz gereklidir. \\.
		for (String s : names) {
			System.out.println(s);
		}

	}
}

Tokenizing mantigini onceki bolumle karistirmayalim.Yukaridaki ornegi dusunecek olursak virgul, nokta gibi karakterleri bir ayrac/delimiter olarak kabul ediyor ve bu kisimlardan ayirma islemi yapiyoruz. Searching mantiginda ise ilgili regex’i bir icerikte/content arama islemi yapiyoruz.

Tokenizing islemini java.util.Scanner sinifi da benzer sekilde yapar.
Ilgili delimiter patternine uygun sekilde icerigi/content token’lara/parcalara ayirir. Varsayilan olarak bosluga gore ayirma islemi yapar.
Dilersek useDelimiter metodunu kullanabiliriz.

import java.util.Scanner;

public class ScannerTest {

	public static void main(String[] args) {

		String strToken;
		Scanner s1 = new Scanner("1 true 34 hi");
		System.out.println("###Test 1 ####");
		while (s1.hasNext()) {
			strToken = s1.next();
			System.out.println(strToken);
		}

		System.out.println("###Test 2 ####");
		while (s1.hasNext()) {
			strToken = s1.next();
			System.out.println(strToken);
			// burada cikti vermeyecek. bu islem bir kere yapilir.

		}
		s1.close();

		System.out.println("###Test 3 ####");
		Scanner s2 = new Scanner("1 true 34 hi");
		int intToken;
		boolean boolToken;
		while (s2.hasNext()) {
			if (s2.hasNextInt()) {
				intToken = s2.nextInt();
				System.out.println("int token:" + intToken);

			} else if (s2.hasNextBoolean()) {
				boolToken = s2.nextBoolean();
				System.out.println("boolean token:" + boolToken);
			} else {
				strToken = s2.next();
				System.out.println("string token:" + strToken);
			}
		}
		// nextInt nextBoolean gibi metotlari kullanabiliriz.
		// birada next metodunu kullanmayi unutmayalim yoksa dongu sonlanmaz.
		s2.close();
		
		Scanner s3 = new Scanner("1,true,34,hi");
		System.out.println("###Test 3 ####");
		s3.useDelimiter(",");
		while (s3.hasNext()) {
			strToken = s3.next();
			System.out.println(strToken);
		} 
		s3.close();
		
		System.out.println("###Test 4 ####");
		String content = "1,true,34,hi";
		String[] tokens = content.split(",");
		for (String s : tokens ) {
			System.out.println(s);
		}

	}
}

Searching ve Tokenizing farkini anlamak icin su ornegi inceleyelim ;

public class SearchingVSTokenizing {

	public static void main(String[] args) {

		Pattern p = Pattern.compile("\\d");
		// \d --> [0-9] anlamina gelmektedir.

		String content = "java1 reg2ex!";
		System.out.println("Searching Test");
		Matcher m = p.matcher(content);

		while (m.find()) {
			System.out.print(m.start() + " ");
			// Searching islemi ilgili regexi bulma islemidir.
		}
		System.out.println();

		String[] tokens = content.split("\\d");
		System.out.println("Tokenizing Test");
		for (String token : tokens) {
			System.out.println(token);
			// Split/tokenizing islemi ise ilgili regex(delimiter) a gore
			// parcalara ayirma islemidir.
		}

	}
}

java.util.StringTokenizer sinifini da kullanabiliriz.

import java.util.StringTokenizer;

public class StringTokenizerTest {

	public static void main(String[] args) {
		String content = "test1 test2 test3";
		StringTokenizer st = new StringTokenizer(content);
		System.out.println("Bosluga gore token ayirma islemi");
		while (st.hasMoreElements()) {
			System.out.println(st.nextElement());
		}

		String content2 = "test1,test2:test3.test4";
		StringTokenizer st2 = new StringTokenizer(content2, ",|:|\\.");
		// StringTokenizer icin delimiter arasinda | karakterine gerek yok.
		// StringTokenizer(content2, ", : \\.");

		System.out.println("virgule gore token ayirma islemi");
		System.out.println("token count :" + st2.countTokens());

		while (st2.hasMoreElements()) {
			/*
			 * hasMoreTokens da kullanilabilir. hasMoreElements, hasMoreTokens
			 * metodunu cagirmaktadir.
			 * public boolean hasMoreElements() {
			 * return hasMoreTokens();
			 * }
			 */
			System.out.println(st2.nextElement());
			/*
			 * nextElement metodu da kullanilabilir. nextElement metodu,
			 * nextToken metodunu cagirmaktadir.
			 * public Object nextElement() {
			 * return nextToken();
			 * }
			 */
		}

	}
}

Formatting
C dilinden hatitlayacagimiz printf fonksiyonu vardi. %d karakterini  kullanarak cikti elde ederdik. Benzer sekilde ozelligi Javada kullanabiliriz. Formatting konusunu anlayabilmek icin ornegi inceleyelim ;

import java.util.Formatter;

public class FormattingTest {

	public static void main(String[] args) {

		System.out.printf("%d", 10);
		System.out.println();

		// System.out.printf("%f",10);
		// java.util.IllegalFormatConversionException hatasi verecektir.
		// %f kayan noktali sayilar/kusuratli sayilar icindir.

		/*
		 *  b boolean
		 *  c char
		 *  d integer
		 *  f floating point
		 *  s string
		 */
		
		System.out.format("%d", 10);
		//format metonu da kullanabiliriz.
		System.out.println();
		
		System.out.printf("%2$d %1$d  %3$f", 123, 456, 10.4);
		// index$ ifadesi ile arguman olarak verilen degerlerin sirasini
		// duzenleyebiliriz.
		System.out.println();

		System.out.printf("%07d", 123);
		// 0 , metoda verilen argumana padding uygular. Sayimiz 7 haneli olana
		// kadar soluna 0 ekleyecektir.

		System.out.println();

		System.out.printf("%+d %+d", 123, -123);
		// Varsayilan olarak pozitif sayilarda + isareti eklenmez. + karakterini
		// ekleyip formatlayabiliriz.
		System.out.println();

		System.out.printf("%(d %(d", 123, -123);
		// ( parantez isareti negatif sayilari parantez icerisine alir.
		// negatif sayiyiyi pozitif olarak formatlar , mutlak degerini alir.
		System.out.println();

		System.out.printf(">%d< \n", 123);
		System.out.printf(">%7d< \n", 123);
		System.out.printf(">%-7d< \n", 123);
		// - karakteri formatlamayi sola dayali yapar.

		// Bu formatlama islemlerini Formatter sinifi yardimi ile de
		// yapabiliriz.
		Formatter formatter = new Formatter();
		Formatter newFormat = formatter.format("%2$d %1$d", 123, 456);
		System.out.println(newFormat);
		formatter.close();
	}
}

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *