S.a. Arkadaşlar,
Bugünkü konumuz threadlar olacak. Elimizden geliğince sade bir şekilde anlatmaya gayret edeceğiz. Muhakkak hepimizin en azından bir kaç defa duyduğunu düşündüm bir kavram , fakat tam olarak nedir nasıl çalışır onu irdelemeye çalışacağız. Peki nedir thread ? Threadler kısaca çalışan iş parçacıklarıdır. Java'nın çoklu thread özelliği ile işlemci yönetimi sağlayabiliriz. Peki bu işlemci yönetiminin bize ne gibi faydaları olur derseniz işlemcinin performansından en iyi şekilde yararlanmak da diyebiliriz, fakat bunu yaparken sistemin çalışmasına etki edebileceğimizi de unutmamak gerekir. İyi uygulanmadığında başımızı ağrıtacağı da kesindir. Şimdi gelelim threadlerin kullanım şekline. Threadler 2 şekilde kullanılabilirler. Bunlardan biri kalıtım diğeri ise interface ile implement etmektir. Fakat hangisi daha uygun diye sorarsanız , bildiğimiz gibi java çoklu kalıtım izin vermediği için eğer biz class Sinif extends Thread yaparsak, kalıtım hakkımızı böyle doldurmuş olacağız. Fakat eğer biz class Sinif implements Thread yaparsak , burada herhangi bir kısıtlama yoktu hatırlarsınız. birden fazla interface de implement edilebiliyordu. Şimdi yavaş yavaş kodlamamıza başlayıp eksik gördüğümüz yerleri tamamlamaya çalışalım
public class CoolThread extends Thread {
@Override
public void run() {
System.out.println("The job is starting!");
}
public static void main(String[] args) {
CoolThread t = new CoolThread();
Thread t2 = new Thread(new CoolThread());
t2.run();
//çalışan threadm canlı değildir. Canlanması için
//start edilmeye ihtiyacı vardır
}
}
//bu 2 kod arasında çalışma mantığı olarak hiç bir fark yoktur
//fakat üstteki kod kalıtım yardımıyla çalışmaktadır
//aşağıdaki kod ise interface uygulayarak çalışmak
//yukarıda da belirttiğimiz gibi tercihimiz alttaki koddan yanadır.
//aşağıdaki koddan devam edeceğimiz için o kodu geliştirdik
class MyRunnableMoreThread implements Runnable {
@Override
public void run() {
System.out.println("run method()");
for (int i = 0; i < 10; i++) {
String name = Thread.currentThread().getName();
long id = Thread.currentThread().getId();
System.out.println("index:" + i + " " + name + " " + id);
}
}
}
public class RunnableMoreThreadTest {
public static void main(String[] args) {
MyRunnableMoreThread myRunnable = new MyRunnableMoreThread();
Thread t1 = new Thread(myRunnable);
Thread t2 = new Thread(myRunnable);
Thread t3 = new Thread(myRunnable);
t1.setName("First");
t2.setName("Second");
t3.setName("Third");
//start threadi başlatır.
t1.start();
t2.start();
t3.start();
//t1.run();
//fakat run start olmadan da çalışır ama thread hala pasiftir
//çünkü run da bir metod olduğundan referans ile çağırabiliriz
}
}
Burada çaktığımız değişkenlik gösterir. Bunun sebebi hangi threadin hangi anda çalışacağının belli olmamasıdır. Yani thread1 çalışıyorken bir anda thread 2 onu keser , tekrar thread 1/3 thread2'yi keser ve bu şekilde devam edebilir, fakat burada önemli olan her threadin görevinin tamamlayıp sonlanacağıdır. Threadlerle ilgili bir kavramları göreceğiz. Bu sayede threadleri yönlendirebiliriz. Bu yönlendirmeleri yapabileceğimiz bir kaç kavram ve metod üzerinde duralım.
New: Threadin oluşturulduğu fakat henüz çalışmaya başlamadığı durumdur
Runnable: Threadin çalışmaya başladığı andır. Thread artık aktiftir.
Waiting: Threadin beklemede olduğu kısımdır. Aktiftir fakat çalışmaz.
Blocked: Senkronize edilmiş bir metodda çalışan thread dışındaki threadler askıya alınır.
Terminatted: Threadin faaliyetinin son bulduğu durumdur.
Kavramlara kısaca baktık, şimdi de bazı metodlara bakıp yazımızı sonlandıralım.
Sleep: Belirtilen süreye kadar metodu bekletir. Süre bittiğinde tekrar çalışacağının garantisi yoktur. Overload metodları vardır. Parametre almayan metodu Exception fırlatır. O nedenle bu hatayı yakalamamız gerekir yoksa program hata verecektir. Statictir.
Yield: Threadlere öncelik verir. Fakat bu öncelik sıralamasının yine de bir garanti durumu yoktur. Statictir. Genelde pek kullanılmaz. Debug ve tet amaçlı kullanılabilir.
Join: Diğer 2 mtedoun aksine static değildir. Overload metodları vardır. Parametre almayan metodu exception fırlatır. Burada ise 1 metod çalışırken diğer metodlar bloklanır. Bir tür senkronize vardır.
31 Ocak 2015 Cumartesi
27 Ocak 2015 Salı
Inner Classes-2
S.a. Arkadaşlar,
Bugünkü konumuz yine dahili sınıflar olacak. Birinci yazıda dahili ve interface dahili sınıfları işlemiştik. Bu yazımızda ise anonymous ve static dahili sınıfları işlemeyi düşünüyoruz. Böylece dahili sınıfları bitireceğiz. Şimdi devam kaldığımız yerden. Öncelikle anonymous dahili sınıfına başlayalım. Adından da anlayacağımız gibi belirsiz ya da adı olmayan sınıf olarak da nitelendirebiliriz. Peki bu ne demektir , isimsiz sınıf mı olur dediğini duyar gibiyim, burada isim olmasından kasıt direkt bir ad yazmak yerine , obje ile birlikte kullanılmasından kaynaklanıyor. Kod tarafına geçeceğimiz zaman yorum satırlarıyla destekleyip ne demek istediğimizi umarım daha iyi anlayacaksınız.
class Keyboard {//extends Computer, run time error
public void write() {
System.out.println("Keyboard Write");
}
public void anotherWrite(){
System.out.println("kEYBOARD wRITE");
}
}
interface Mouse { //diğer dahil sınıflardaki gibi interface
public void move();
public final static int sensivity=5;
int speed=5; //yukarıdaki tanımlama ile aşağıda aynıydı hatırlarsanız
}
abstract class Printer{ // ve soyut sınıf tanımlanabilir
public abstract void scan();
}
public class Computer {
Keyboard keyboard = new Keyboard() {
@Override
public void write() {
System.out.println("Anonymous Write");
}
public void bigWrite(){
System.out.println("ANANYMOUS WRITE");
}
}; // noktali virgulu unutmayalim!
Keyboard keyboard2 = new Keyboard();
public static void main(String[] args) {
Computer com = new Computer();
com.keyboard.write();
com.keyboard2.write();
//com.keyboard.bigWrite();
com.keyboard.anotherWrite();
com.keyboard2.anotherWrite();
Mouse mouse = new Mouse() {
@Override
public void move() {
System.out.println("Anonymous Move");
}
};//noktalı virgüllere dikkat
mouse.move();
String localVariable="local";
final String localFinal="local Final";
Printer printer = new Printer (){
// static String staticVariable = "compile error"; error
static final String staticVariable = "run";
//static final void metod();
//metod her haliyle hata verir hatırlarsanız
@Override
public void scan(){
System.out.println("Anonymous Scan");
//System.out.println(localVariable);
//final olursa dışarıdaki local değişkene erişebilir
System.out.println(localFinal);
}
};//noktalı virgüller dikkat
printer.scan();
}
}
Yorum satırlarıyla elimiz geldiğince gerekli yerlerde konuyu anlatmaya çalıştık ama karışık gelmiş olabilir bazı şeyler , belki de yeterince sade anlatamamış olabiliriz. Anlamadığımız yerler olduğu zaman sormakta çekinmeyin. Birlikte öğrenmeye gayret ederiz. Şimdi de static dahili sınıflara geçelim. Static dahili sınıf aslında tam olarak dahili sınıf olarak da tanımlanmayabilir. Bu ne demek şimdi diye sorduğunuzu duyar gibiyim. Şöyle anlatalım. Bir sınıf içerisinde sıradan bir metod çağırdığımızda ne yapmamız gerekiyordu. Öncelikle bir nesne oluşturup Sinif sinif= new Sinif(); sinif.metod(); demememiz gerekliydi bildiğiniz gibi fakat bu metod static olduğunda ne yapıyorduk her hangi bir obje oluşturmadan da metodu çağırabiliyorduk. Bu static dahili sınıf da öyle , dışarıdaki sınıfa ihtiyaç olmadan değişken ve metodlara ulaşılabilir. Kod kısmına geçip örneklendirdiğimiz zaman daha iyi anlayacağınızı düşünüyoruz.
public class Outer {
static class StaticNested {
private String instanceVariable = "I am instance variable";
private static String staticVariable = "i am static variable";
void method() {
System.out.println("StaticNested method");
System.out.println(instanceVariable);
System.out.println(staticVariable);
}
static void staticMethod() {
System.out.println("StaticNested static method");
//System.out.println(instanceVariable);
//beklenen yine oldu ve staticte static olmayan çalışmaz
//staticleri asil olarak düşünün, ve asiller kendi aralarına
//diğer tabakadakileri almıyorlar ...
//ama diğer tabakalardaki insanların olduğu yere
//asiller girebiliyor. Umarım iyi bir örnek olmuştur
System.out.println(staticVariable);
}
}
class InnerClass {
void method() {
System.out.println("InnerClass method");
}
//static void staticMethod() {
//System.out.println("compile error");
//}
//static olmayan sınıf içinde static metod tanımlanmaz
}
public static void main(String[] args) {
Outer.InnerClass innerClass = new Outer().new InnerClass();
InnerClass innerClass2 = new Outer().new InnerClass();
//yukarıdaki static olmayan dahili sınıf tanımlaması
//aşağıdaki ise static sınıf tanımlaması
//aradaki farka dikkat edin lütfen
StaticNested staticNested = new StaticNested();
staticNested.method();
//Static.method desek hata çünkü metod static değildir!!
StaticNested.staticMethod();
//baş harfe dikkat, küçük harf yaptığımız zaman warning veriyor
//diyor ki obje tanımlamanıza gerek yoktur direk çağırabilirsiniz
//bunu söylemesinin sebebi static oluşudur
}
}
Static dahili sınıflarla birlikte hem yazımızı hem de dahili sınıfları geride bıraktık. Umarız en iyi şekilde verim alabilirsiniz. Çalışmalarınıza başarılar dileriz. Kolay gelsin
Bugünkü konumuz yine dahili sınıflar olacak. Birinci yazıda dahili ve interface dahili sınıfları işlemiştik. Bu yazımızda ise anonymous ve static dahili sınıfları işlemeyi düşünüyoruz. Böylece dahili sınıfları bitireceğiz. Şimdi devam kaldığımız yerden. Öncelikle anonymous dahili sınıfına başlayalım. Adından da anlayacağımız gibi belirsiz ya da adı olmayan sınıf olarak da nitelendirebiliriz. Peki bu ne demektir , isimsiz sınıf mı olur dediğini duyar gibiyim, burada isim olmasından kasıt direkt bir ad yazmak yerine , obje ile birlikte kullanılmasından kaynaklanıyor. Kod tarafına geçeceğimiz zaman yorum satırlarıyla destekleyip ne demek istediğimizi umarım daha iyi anlayacaksınız.
class Keyboard {//extends Computer, run time error
public void write() {
System.out.println("Keyboard Write");
}
public void anotherWrite(){
System.out.println("kEYBOARD wRITE");
}
}
interface Mouse { //diğer dahil sınıflardaki gibi interface
public void move();
public final static int sensivity=5;
int speed=5; //yukarıdaki tanımlama ile aşağıda aynıydı hatırlarsanız
}
abstract class Printer{ // ve soyut sınıf tanımlanabilir
public abstract void scan();
}
public class Computer {
Keyboard keyboard = new Keyboard() {
@Override
public void write() {
System.out.println("Anonymous Write");
}
public void bigWrite(){
System.out.println("ANANYMOUS WRITE");
}
}; // noktali virgulu unutmayalim!
Keyboard keyboard2 = new Keyboard();
public static void main(String[] args) {
Computer com = new Computer();
com.keyboard.write();
com.keyboard2.write();
//com.keyboard.bigWrite();
com.keyboard.anotherWrite();
com.keyboard2.anotherWrite();
Mouse mouse = new Mouse() {
@Override
public void move() {
System.out.println("Anonymous Move");
}
};//noktalı virgüllere dikkat
mouse.move();
String localVariable="local";
final String localFinal="local Final";
Printer printer = new Printer (){
// static String staticVariable = "compile error"; error
static final String staticVariable = "run";
//static final void metod();
//metod her haliyle hata verir hatırlarsanız
@Override
public void scan(){
System.out.println("Anonymous Scan");
//System.out.println(localVariable);
//final olursa dışarıdaki local değişkene erişebilir
System.out.println(localFinal);
}
};//noktalı virgüller dikkat
printer.scan();
}
}
Yorum satırlarıyla elimiz geldiğince gerekli yerlerde konuyu anlatmaya çalıştık ama karışık gelmiş olabilir bazı şeyler , belki de yeterince sade anlatamamış olabiliriz. Anlamadığımız yerler olduğu zaman sormakta çekinmeyin. Birlikte öğrenmeye gayret ederiz. Şimdi de static dahili sınıflara geçelim. Static dahili sınıf aslında tam olarak dahili sınıf olarak da tanımlanmayabilir. Bu ne demek şimdi diye sorduğunuzu duyar gibiyim. Şöyle anlatalım. Bir sınıf içerisinde sıradan bir metod çağırdığımızda ne yapmamız gerekiyordu. Öncelikle bir nesne oluşturup Sinif sinif= new Sinif(); sinif.metod(); demememiz gerekliydi bildiğiniz gibi fakat bu metod static olduğunda ne yapıyorduk her hangi bir obje oluşturmadan da metodu çağırabiliyorduk. Bu static dahili sınıf da öyle , dışarıdaki sınıfa ihtiyaç olmadan değişken ve metodlara ulaşılabilir. Kod kısmına geçip örneklendirdiğimiz zaman daha iyi anlayacağınızı düşünüyoruz.
public class Outer {
static class StaticNested {
private String instanceVariable = "I am instance variable";
private static String staticVariable = "i am static variable";
void method() {
System.out.println("StaticNested method");
System.out.println(instanceVariable);
System.out.println(staticVariable);
}
static void staticMethod() {
System.out.println("StaticNested static method");
//System.out.println(instanceVariable);
//beklenen yine oldu ve staticte static olmayan çalışmaz
//staticleri asil olarak düşünün, ve asiller kendi aralarına
//diğer tabakadakileri almıyorlar ...
//ama diğer tabakalardaki insanların olduğu yere
//asiller girebiliyor. Umarım iyi bir örnek olmuştur
System.out.println(staticVariable);
}
}
class InnerClass {
void method() {
System.out.println("InnerClass method");
}
//static void staticMethod() {
//System.out.println("compile error");
//}
//static olmayan sınıf içinde static metod tanımlanmaz
}
public static void main(String[] args) {
Outer.InnerClass innerClass = new Outer().new InnerClass();
InnerClass innerClass2 = new Outer().new InnerClass();
//yukarıdaki static olmayan dahili sınıf tanımlaması
//aşağıdaki ise static sınıf tanımlaması
//aradaki farka dikkat edin lütfen
StaticNested staticNested = new StaticNested();
staticNested.method();
//Static.method desek hata çünkü metod static değildir!!
StaticNested.staticMethod();
//baş harfe dikkat, küçük harf yaptığımız zaman warning veriyor
//diyor ki obje tanımlamanıza gerek yoktur direk çağırabilirsiniz
//bunu söylemesinin sebebi static oluşudur
}
}
Static dahili sınıflarla birlikte hem yazımızı hem de dahili sınıfları geride bıraktık. Umarız en iyi şekilde verim alabilirsiniz. Çalışmalarınıza başarılar dileriz. Kolay gelsin
Inner Classes
S.a. Arkadaşlar,
Bugünkü konumuz inner classes olacak. Türkçeye dahili sınıf olarak da çevirebiliriz. Java sınıf içinde sınıf tanımlamamıza izin verir. Peki bunun bize verdiği avantajlar nelerdir dersek, Java'da bildiğimiz üzere çoklu kalıtım yoktur. Yani SubClass extends SuperClass,Super2Class gibi bir tanımlama yoktur. Bunu Java'da dahili sınıflar ve interfaceler yapar. Öncelikle kod okunurluğunu sağlar. Çünkü bir sürü sınıf yerine , her sınıfın ilgili olduğu alt sınıflarını oluşturabiliriz. Bu da bize bir sürü ayrı sınıflar yerine daha derli toplu , hiyerarşik bir yapı sağlar. Tabi bunun değerini büyük projelerde daha iyi anlayabiliriz. Ayrıca bu iç sınıflar private olarak tanımlanabilir ve kendi dış sınıfının temel elemanları hariç , diğer inner classlar erişemez, fakat bizim classlarda public ve default erişimi dışında private veya protected erişimi yoktu. Bu da bize daha iyi kapsülleme sağlar. Şimdi de bu sınıfların kullanım ve özelliklerine geçelim. Burda ise kod üzerinden ilerlemekte fayda var
public class OuterClass {
private String gizli = "static olmayan gizli";
private static String gizliStatic = "static ve gizli";
public static void main(String[] args) {
OuterClass.InnerClass innerRef = new OuterClass().new InnerClass();
innerRef.innerTestMethod();
//içinde bulunduğumuz main static ama çağırdığımız metod
//static olmadığı için obje yardımıyla çağırmalıyız
System.out.println(innerRef.kelime);//yukarıdaki kural yine geçerli
}
private void outerTestMethod() {
System.out.println("Dış Test Metodu");
}
private static void outerStaticTestMethod() {
System.out.println("Static Dış Test Metodu");
}
private class InnerClass { //class olsa ya default ya public olurdu
private String kelime = "Private Tanımlama";
//burada staticle birlikte final kullanılmazsa error verir
private static final String staticInner = "Innerde Statiklik";
//private static final void metod(); Hatalı
//metod static olmaz. Çünkü static olmayan bir metod içinde
//static bir metod tanımlamaya çalışmış oluruz
private void innerTestMethod() {
System.out.println(gizli);
System.out.println(gizliStatic);
outerTestMethod();
//dikkat edin bir obje oluşturup çağırmıyoruz
//çünkü zaten hem iç sınıf static değil hem metod static değil
outerStaticTestMethod();
//staticlerde zaten direkt olarak çağırabiliyorduk
}
}
}
Classlar durum şimdilik böyle , peki interfacelerde nasıl olacak peki ? İnterfaceler biraz daha farklı mesela interface , herhangi bir sınıf veya interface içerisinde tanımlasa dahi private veya protected değeri alamaz. Nedeni de hatırlayacağımız üzere interfacelerin public abstract özelliği taşıyor olmasındandır. Başka bir konu ise override konusu. Bildiğimiz gibi interfaceler içerisinde gövdesiz metod ve sabit değişken tanımlayabiliyorduk. Peki metodları nerede override etmemiz gerekir diye soracak olursak , eğer içerideki interfaceyi kullanırsak sadece inner interfaceleri override tanımlamamız yeterlidir. Aynı şey dışarıdaki interfaceler için de geçerlidir. Kısa bir örnek yaparsak belki daha iyi anlamış oluruz.
interface OuterNestedInterface {
public abstract void outerMethod();
public interface PublicNestedInterface {
public abstract void innerMethod();
}
}
//implement ederken önce dış sonra iç sınıf yazılmasına dikkat
public class OuterNestedTest implements OuterNestedInterface.PublicNestedInterface {
@Override
public void innerMethod() {
//sadece içerideki metod override edilmiş !!
}
}
class Outer2 implements OuterNestedInterface {
@Override
public void outerMethod() {
//sadece dışarıdaki metod override edilmiş
}
}
//birden fazla extends kullanılmaz(çoklu kalıtım yoktur), fakat implementler edilebilir
class Outer3 implements OuterNestedInterface, OuterNestedInterface.PublicNestedInterface {
@Override
public void outerMethod() {
//hem dış metod
}
@Override
public void innerMethod() {
//hem iç metod override edilmeli
}
}
Bugünkü konumuz inner classes olacak. Türkçeye dahili sınıf olarak da çevirebiliriz. Java sınıf içinde sınıf tanımlamamıza izin verir. Peki bunun bize verdiği avantajlar nelerdir dersek, Java'da bildiğimiz üzere çoklu kalıtım yoktur. Yani SubClass extends SuperClass,Super2Class gibi bir tanımlama yoktur. Bunu Java'da dahili sınıflar ve interfaceler yapar. Öncelikle kod okunurluğunu sağlar. Çünkü bir sürü sınıf yerine , her sınıfın ilgili olduğu alt sınıflarını oluşturabiliriz. Bu da bize bir sürü ayrı sınıflar yerine daha derli toplu , hiyerarşik bir yapı sağlar. Tabi bunun değerini büyük projelerde daha iyi anlayabiliriz. Ayrıca bu iç sınıflar private olarak tanımlanabilir ve kendi dış sınıfının temel elemanları hariç , diğer inner classlar erişemez, fakat bizim classlarda public ve default erişimi dışında private veya protected erişimi yoktu. Bu da bize daha iyi kapsülleme sağlar. Şimdi de bu sınıfların kullanım ve özelliklerine geçelim. Burda ise kod üzerinden ilerlemekte fayda var
public class OuterClass {
private String gizli = "static olmayan gizli";
private static String gizliStatic = "static ve gizli";
public static void main(String[] args) {
OuterClass.InnerClass innerRef = new OuterClass().new InnerClass();
innerRef.innerTestMethod();
//içinde bulunduğumuz main static ama çağırdığımız metod
//static olmadığı için obje yardımıyla çağırmalıyız
System.out.println(innerRef.kelime);//yukarıdaki kural yine geçerli
}
private void outerTestMethod() {
System.out.println("Dış Test Metodu");
}
private static void outerStaticTestMethod() {
System.out.println("Static Dış Test Metodu");
}
private class InnerClass { //class olsa ya default ya public olurdu
private String kelime = "Private Tanımlama";
//burada staticle birlikte final kullanılmazsa error verir
private static final String staticInner = "Innerde Statiklik";
//private static final void metod(); Hatalı
//metod static olmaz. Çünkü static olmayan bir metod içinde
//static bir metod tanımlamaya çalışmış oluruz
private void innerTestMethod() {
System.out.println(gizli);
System.out.println(gizliStatic);
outerTestMethod();
//dikkat edin bir obje oluşturup çağırmıyoruz
//çünkü zaten hem iç sınıf static değil hem metod static değil
outerStaticTestMethod();
//staticlerde zaten direkt olarak çağırabiliyorduk
}
}
}
Classlar durum şimdilik böyle , peki interfacelerde nasıl olacak peki ? İnterfaceler biraz daha farklı mesela interface , herhangi bir sınıf veya interface içerisinde tanımlasa dahi private veya protected değeri alamaz. Nedeni de hatırlayacağımız üzere interfacelerin public abstract özelliği taşıyor olmasındandır. Başka bir konu ise override konusu. Bildiğimiz gibi interfaceler içerisinde gövdesiz metod ve sabit değişken tanımlayabiliyorduk. Peki metodları nerede override etmemiz gerekir diye soracak olursak , eğer içerideki interfaceyi kullanırsak sadece inner interfaceleri override tanımlamamız yeterlidir. Aynı şey dışarıdaki interfaceler için de geçerlidir. Kısa bir örnek yaparsak belki daha iyi anlamış oluruz.
interface OuterNestedInterface {
public abstract void outerMethod();
public interface PublicNestedInterface {
public abstract void innerMethod();
}
}
//implement ederken önce dış sonra iç sınıf yazılmasına dikkat
public class OuterNestedTest implements OuterNestedInterface.PublicNestedInterface {
@Override
public void innerMethod() {
//sadece içerideki metod override edilmiş !!
}
}
class Outer2 implements OuterNestedInterface {
@Override
public void outerMethod() {
//sadece dışarıdaki metod override edilmiş
}
}
//birden fazla extends kullanılmaz(çoklu kalıtım yoktur), fakat implementler edilebilir
class Outer3 implements OuterNestedInterface, OuterNestedInterface.PublicNestedInterface {
@Override
public void outerMethod() {
//hem dış metod
}
@Override
public void innerMethod() {
//hem iç metod override edilmeli
}
}
25 Ocak 2015 Pazar
Generics-2
S.a. Arkadaşlar,
Bugünkü konumuz genericsler olacak. Daha önce özet maheyetinde bir yazı yazmıştım ama şimdi daha farklı bir özellikleri ile ele alacağız. Birinci yazıya buradan erişebilirsiniz. Bu konuyla ilgili temel bilgileri orada bulabilirsiniz. Burada biraz daha ayrıntılı olarak ele almaya çalışacağız. Belki konuya paldır küldür girmiş gibi olacağız ama yaptığımız örnekler jeneriklerin özellikleri ile ilgili neler yapılıp neler yapılmayacağı ile ilgili gibi düşünün. Şöyle söylememek gerekirse bildiğimiz gibi dizilerde IS-A kavramını kullanmamıza izin veriyordu, fakat jeneriklerde nasıl oluyor diye bir soru aklımıza gelirse ? Bir bakalım hemen nasıl olduğuna ..
class Living {
}
class Animal extends Living{
}
class Dog extends Animal {
}
public class ArrayTestMethod {
public static void main(String[] args) {
Animal[] animalArray = new Animal[5];
Dog[] dogArray = new Dog[5];
Animal[] animalDogArray = new Dog[5];
//burada görüldüğü gibi Dog IS-A Animal
//olduğundan hata olmayacaktır
arrayRules(animalArray);
arrayRules(dogArray);
arrayRules(animalDogArray);
/******************************/
List<Animal> animalList = new ArrayList<Animal>();
List<Dog> dogList = new ArrayList<Dog>();
List<Living> livinglist= new ArrayList<>();
addAnimal(animalList);
addAnimal(dogList);//dikkat
//eğer = extends wildcardsı kullanılmasa
//Dog subclass bile olsa error verecektir
//ama dizilerde böyle bir durum yok
//addAnimal(livinglist);//dikkat ? extends wildcardı
//yerine ? super olsa bu kod çalışacaktır fakat bu sefer de
//dogList çalışmayacaktır. Çünkü Super üst sınıflara izin verirken
//extends ise altı sınıflara izin verir.
}
public static void arrayRules(Animal[] animal) {
System.out.println("test");
}
public static void addAnimal(List<? extends Animal> animalList) {
//burada ise sadece null ekleyebiliriz
animalList.add(null);
//? extends kaldırdığımız zaman
//addAnimal(new Dog()); gibi bir tanımla yapılabilir
}
}
Bugünkü konumuz genericsler olacak. Daha önce özet maheyetinde bir yazı yazmıştım ama şimdi daha farklı bir özellikleri ile ele alacağız. Birinci yazıya buradan erişebilirsiniz. Bu konuyla ilgili temel bilgileri orada bulabilirsiniz. Burada biraz daha ayrıntılı olarak ele almaya çalışacağız. Belki konuya paldır küldür girmiş gibi olacağız ama yaptığımız örnekler jeneriklerin özellikleri ile ilgili neler yapılıp neler yapılmayacağı ile ilgili gibi düşünün. Şöyle söylememek gerekirse bildiğimiz gibi dizilerde IS-A kavramını kullanmamıza izin veriyordu, fakat jeneriklerde nasıl oluyor diye bir soru aklımıza gelirse ? Bir bakalım hemen nasıl olduğuna ..
class Living {
}
class Animal extends Living{
}
class Dog extends Animal {
}
public class ArrayTestMethod {
public static void main(String[] args) {
Animal[] animalArray = new Animal[5];
Dog[] dogArray = new Dog[5];
Animal[] animalDogArray = new Dog[5];
//burada görüldüğü gibi Dog IS-A Animal
//olduğundan hata olmayacaktır
arrayRules(animalArray);
arrayRules(dogArray);
arrayRules(animalDogArray);
/******************************/
List<Animal> animalList = new ArrayList<Animal>();
List<Dog> dogList = new ArrayList<Dog>();
List<Living> livinglist= new ArrayList<>();
addAnimal(animalList);
addAnimal(dogList);//dikkat
//eğer = extends wildcardsı kullanılmasa
//Dog subclass bile olsa error verecektir
//ama dizilerde böyle bir durum yok
//addAnimal(livinglist);//dikkat ? extends wildcardı
//yerine ? super olsa bu kod çalışacaktır fakat bu sefer de
//dogList çalışmayacaktır. Çünkü Super üst sınıflara izin verirken
//extends ise altı sınıflara izin verir.
}
public static void arrayRules(Animal[] animal) {
System.out.println("test");
}
public static void addAnimal(List<? extends Animal> animalList) {
//burada ise sadece null ekleyebiliriz
animalList.add(null);
//? extends kaldırdığımız zaman
//addAnimal(new Dog()); gibi bir tanımla yapılabilir
}
}
23 Ocak 2015 Cuma
Set && Map
S.a. Arkadaşlar,
Bugünkü konumuzda yine koleksiyonlardan devam edeceğiz , fakat bu sefer farklı bir yazıyla devam edeceğiz. Bu sefer de set ve map sınıflarını inceleyeceğiz. Öncelikle Set sınıfımızla başlayalım. Set sınıfımızda hashSet,linkedHashSet ve treeSet lerden bahsedeceğiz. Genel olarak arrayListlerle aynı olsa da bazı yönleriyle farklıdır gösterirler. Mesela aynı 2 eleman eklenemez. Derleyici hata vermez, fakat hafızasına bir adetini alır. treeSette order ve sorted iken diğerleri bu iki özelliği aynı anda taşımaz. Daha önce de zaman zaman açıkladık ordered ve sorted konusunu yine kısaca söylemek gerekirse bir tür sıralamadır int ve String arasında. Bu nedenle TreeSetlerde farklı tipler kullanılamaz. Çünkü String ile int karşılaştıramaz, ama diğer ikisinde ise jenerik ile kısıtlama yapılmadığı sürece kısıtlama yapılabilir. Örnekle söyleyecek olursak
public class TreeSetTest {
public static void main(String[] args) {
LinkedHashSet<Number> linkedHashSet = new LinkedHashSet <Number>();
linkedHashSet.add(2);//normalde aynı elemanı 2 defa bulundurmaz
linkedHashSet.add(2L);//fakat bu değişkenlerin her biri farklı tiptedir
linkedHashSet.add((short)2);
for(Number aaa: linkedHashSet) System.out.println(" " + aaa);
Set treeSet = new TreeSet();
Set<Number> ts1= new TreeSet<Number>() ;
//treeSet.add((short)10);//türü short olduğundan yine hata
treeSet.add(20);
//treeSet.add("ClassCastException");
for(Object aa: treeSet) System.out.println(" " + aa);
}
}
Kısaca Setler böyle , ArrayListle benzerlikleri çok fazla, o yüzden önemli gördüğümüz bir kaç noktayı belirtmiş olduk. Şimdi de maplara geçiyoruz. Map kısmını da 4 başlık altında inceleyeceğiz. Bu üç başlığa geçmeden önce maplerin genel özelliklerinden biraz bahsedelim. 2 kısımdan oluşurlar. 1.si key 2.si value kısmıdır. 1.kısım primer key gibidir. Yani değerleri farklı olmak zorundadır, fakat value değeri birden farklı değerler alabilirler. Eğer key kısmında birden fazla aynı değer varsa en altta olan değer geçerli sayılacaktır. Bunun sebebi override etmesidir. Şimdi de bahsettiğimiz 4 kısmına geçelim. Onlardan da kısaca bahsedip daha sonra da kodla açıklamaya çalışalım.
HashMap: Unordered ve Unsorted. null değerler alabilir. Farklı değişkenler alabilir
Hashtable: null değerler alamaz.
LinkedHashMap:. Null değer alabilir.
TreeMap: Sıralıdır ve ordered. Bu yüzden aynı tip değişken alır
Burada HashMap ve Hashtable HashSet ile benzerlik özellikler gösterse de LinkedHashMap burada biraz daha farklı , bu yüzden biz de ağırlığımızı LinkedHashMap üzerine vermeyi düşünüyoruz.
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
treeMap.put(1, "one");
treeMap.put(2, "two");
treeMap.put(30, "thirty");
treeMap.put(40, "forty");
treeMap.put(50, "fifty");
treeMap.put(70, "seventy");
treeMap.put(100, "hundred");
// ceilingEntry(key) 41den büyük en küçük sayı döndürür
//40 yazsak 40 key/value kısmını seçecekti
Entry<Integer, String> ceilingEntry = treeMap.ceilingEntry(40);
Integer ceilingEntryKey = ceilingEntry.getKey();
String ceilingEntryValue = ceilingEntry.getValue();
System.out.println("ceilingEntryKey: " + ceilingEntryKey);
System.out.println("ceilingEntryValue: " + ceilingEntryValue);
// higherEntry(key) 40den küçük en büyük key/value döndürür
//40 olsa dahi 40ı almaz, dikkat !!
Entry<Integer, String> higherEntry = treeMap.higherEntry(40);
Integer higherEntryKey = higherEntry.getKey();
String higherEntryValue = higherEntry.getValue();
System.out.println("higherEntryKey: " + higherEntryKey);
System.out.println("higherEntryKey: " + higherEntryValue);
// floorEntry(key) kendisinden küçük en büyük sayıyı döndürür
//aynı değer varsa onu seçer
Entry<Integer, String> floorEntry = treeMap.floorEntry(30);
Integer floorEntryKey = floorEntry.getKey();
String floorEntryValue = floorEntry.getValue();
System.out.println("floorEntryKey: " + floorEntryKey);
System.out.println("floorEntryValue: " + floorEntryValue);
// floorEntry(key) kendisinden küçük en büyük sayıyı döndürür
//aynı değer varsa onu seçmez
Entry<Integer, String> lowerEntry = treeMap.lowerEntry(30);
Integer lowerEntryKey = lowerEntry.getKey();
String lowerEntryValue = lowerEntry.getValue();
System.out.println("lowerEntryKey: " + lowerEntryKey);
System.out.println("lowerEntryValue: " + lowerEntryValue);
//ilk değeri döndürür
Entry<Integer, String> firstEntry = treeMap.firstEntry();
Integer firstKey = treeMap.firstKey();
System.out.println("ilk Deger:" + firstKey);
//son değeri döndürrü
Entry<Integer, String> lastEntry = treeMap.lastEntry();
Integer lastKey = treeMap.lastKey();
System.out.println("Son Deger:" + lastKey);
//ilk değeri döndürür ve siler
Entry<Integer, String> pollFirstEntry = treeMap.pollFirstEntry();
//son değeri döndürür ve siler
Entry<Integer, String> pollLastEntry = treeMap.pollLastEntry();
//Mapin son hali. ilk ve son elemanları silinmiş!!
for(Object key: treeMap.keySet()) System.out.println(key);
}
Burada TreeMapin bazı metodlarına baktık , unutmayın bu metodları TreeSet ile de kullanabiliriz. Örnekleri çoğaltıp sizler de kafanıza takılan yerleri cevaplandırabilirsiniz. İyi çalışmalar Kolay gelsin
Bugünkü konumuzda yine koleksiyonlardan devam edeceğiz , fakat bu sefer farklı bir yazıyla devam edeceğiz. Bu sefer de set ve map sınıflarını inceleyeceğiz. Öncelikle Set sınıfımızla başlayalım. Set sınıfımızda hashSet,linkedHashSet ve treeSet lerden bahsedeceğiz. Genel olarak arrayListlerle aynı olsa da bazı yönleriyle farklıdır gösterirler. Mesela aynı 2 eleman eklenemez. Derleyici hata vermez, fakat hafızasına bir adetini alır. treeSette order ve sorted iken diğerleri bu iki özelliği aynı anda taşımaz. Daha önce de zaman zaman açıkladık ordered ve sorted konusunu yine kısaca söylemek gerekirse bir tür sıralamadır int ve String arasında. Bu nedenle TreeSetlerde farklı tipler kullanılamaz. Çünkü String ile int karşılaştıramaz, ama diğer ikisinde ise jenerik ile kısıtlama yapılmadığı sürece kısıtlama yapılabilir. Örnekle söyleyecek olursak
public class TreeSetTest {
public static void main(String[] args) {
LinkedHashSet<Number> linkedHashSet = new LinkedHashSet <Number>();
linkedHashSet.add(2);//normalde aynı elemanı 2 defa bulundurmaz
linkedHashSet.add(2L);//fakat bu değişkenlerin her biri farklı tiptedir
linkedHashSet.add((short)2);
for(Number aaa: linkedHashSet) System.out.println(" " + aaa);
Set treeSet = new TreeSet();
Set<Number> ts1= new TreeSet<Number>() ;
//treeSet.add((short)10);//türü short olduğundan yine hata
treeSet.add(20);
//treeSet.add("ClassCastException");
for(Object aa: treeSet) System.out.println(" " + aa);
}
}
Kısaca Setler böyle , ArrayListle benzerlikleri çok fazla, o yüzden önemli gördüğümüz bir kaç noktayı belirtmiş olduk. Şimdi de maplara geçiyoruz. Map kısmını da 4 başlık altında inceleyeceğiz. Bu üç başlığa geçmeden önce maplerin genel özelliklerinden biraz bahsedelim. 2 kısımdan oluşurlar. 1.si key 2.si value kısmıdır. 1.kısım primer key gibidir. Yani değerleri farklı olmak zorundadır, fakat value değeri birden farklı değerler alabilirler. Eğer key kısmında birden fazla aynı değer varsa en altta olan değer geçerli sayılacaktır. Bunun sebebi override etmesidir. Şimdi de bahsettiğimiz 4 kısmına geçelim. Onlardan da kısaca bahsedip daha sonra da kodla açıklamaya çalışalım.
HashMap: Unordered ve Unsorted. null değerler alabilir. Farklı değişkenler alabilir
Hashtable: null değerler alamaz.
LinkedHashMap:. Null değer alabilir.
TreeMap: Sıralıdır ve ordered. Bu yüzden aynı tip değişken alır
Burada HashMap ve Hashtable HashSet ile benzerlik özellikler gösterse de LinkedHashMap burada biraz daha farklı , bu yüzden biz de ağırlığımızı LinkedHashMap üzerine vermeyi düşünüyoruz.
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<Integer, String>();
treeMap.put(1, "one");
treeMap.put(2, "two");
treeMap.put(30, "thirty");
treeMap.put(40, "forty");
treeMap.put(50, "fifty");
treeMap.put(70, "seventy");
treeMap.put(100, "hundred");
// ceilingEntry(key) 41den büyük en küçük sayı döndürür
//40 yazsak 40 key/value kısmını seçecekti
Entry<Integer, String> ceilingEntry = treeMap.ceilingEntry(40);
Integer ceilingEntryKey = ceilingEntry.getKey();
String ceilingEntryValue = ceilingEntry.getValue();
System.out.println("ceilingEntryKey: " + ceilingEntryKey);
System.out.println("ceilingEntryValue: " + ceilingEntryValue);
// higherEntry(key) 40den küçük en büyük key/value döndürür
//40 olsa dahi 40ı almaz, dikkat !!
Entry<Integer, String> higherEntry = treeMap.higherEntry(40);
Integer higherEntryKey = higherEntry.getKey();
String higherEntryValue = higherEntry.getValue();
System.out.println("higherEntryKey: " + higherEntryKey);
System.out.println("higherEntryKey: " + higherEntryValue);
// floorEntry(key) kendisinden küçük en büyük sayıyı döndürür
//aynı değer varsa onu seçer
Entry<Integer, String> floorEntry = treeMap.floorEntry(30);
Integer floorEntryKey = floorEntry.getKey();
String floorEntryValue = floorEntry.getValue();
System.out.println("floorEntryKey: " + floorEntryKey);
System.out.println("floorEntryValue: " + floorEntryValue);
// floorEntry(key) kendisinden küçük en büyük sayıyı döndürür
//aynı değer varsa onu seçmez
Entry<Integer, String> lowerEntry = treeMap.lowerEntry(30);
Integer lowerEntryKey = lowerEntry.getKey();
String lowerEntryValue = lowerEntry.getValue();
System.out.println("lowerEntryKey: " + lowerEntryKey);
System.out.println("lowerEntryValue: " + lowerEntryValue);
//ilk değeri döndürür
Entry<Integer, String> firstEntry = treeMap.firstEntry();
Integer firstKey = treeMap.firstKey();
System.out.println("ilk Deger:" + firstKey);
//son değeri döndürrü
Entry<Integer, String> lastEntry = treeMap.lastEntry();
Integer lastKey = treeMap.lastKey();
System.out.println("Son Deger:" + lastKey);
//ilk değeri döndürür ve siler
Entry<Integer, String> pollFirstEntry = treeMap.pollFirstEntry();
//son değeri döndürür ve siler
Entry<Integer, String> pollLastEntry = treeMap.pollLastEntry();
//Mapin son hali. ilk ve son elemanları silinmiş!!
for(Object key: treeMap.keySet()) System.out.println(key);
}
Burada TreeMapin bazı metodlarına baktık , unutmayın bu metodları TreeSet ile de kullanabiliriz. Örnekleri çoğaltıp sizler de kafanıza takılan yerleri cevaplandırabilirsiniz. İyi çalışmalar Kolay gelsin
22 Ocak 2015 Perşembe
Comparable & Comparator ile Sıralama
S.a. Arkadaşlar,
Bugünkü konumuz ArrayListelerde sıralama olacak, fakat bu sıralamalarımız basit manada String veya int sıralamak değil de , bir önceki yazımızda bahsettiğimiz objeler arasında sıralama olacaktır. Ne demek istiyoruz peki , elimizde bir tip değişken var. Örneğin int[] dizi={1,4,2,3}; gibi bir dizi olsun elimizde bunu nasıl sıralıyorduk Arrays.sort(dizi) yazıyorduk ve sıralama yapıyorduk. ArrayListlerde de buna benzer bir olay var. Orda Collection.sort() diye sıralama yapıyoruz, fakat bazen karşımıza bir sınıf geldiğini ve bunun birden fazla değişkeni olduğunu düşünelim hangisine göre sıralama yapacağı ise muallakta kalacağı için işte tam bu noktada comporable ve comparator devreye girer. Şimdi kodumuz üzerinden gidelim. Umarım bu sayede daha iyi pekişecektir söylemeye çalıştıklarımız.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Car implements Comparable <Car>{
//<Car> enerjik ile sınırlama getiriyor
//Sınırlama koymak istemezsek comporTo metodunda
//değişiklik yapmak zorundayız.Car yerine Object tanımlanmalı
public Car(String marka, Integer fiyat) {
super();
this.marka = marka;
this.fiyat = fiyat;
}
String marka;
Integer fiyat;
@Override
public int compareTo(Car car) {
return fiyat.compareTo(car.fiyat);
//eğer ters sıralama yapmak istersek
//car.fiyat.compareTo(fiyat);
//markaya göre sıralama yapmak içinse
//return marka.compareTo(car.marka);
}
//burada compareTo ile neye göre sıralama
//yapmak istediğimizi override etmezsek hata alırız
@Override
public String toString() {
return "Car [ marka=" + marka + ", fiyat=" + fiyat + "]";
}
}
public class ComparableTest {
public static void main(String[] args) {
Car ford = new Car("ford", 100);
Car fiat = new Car( "fiat", 50);
Car subaru = new Car("subaru", 5000);
Car bmw = new Car("bmw", 1000);
List <Car> carList = new ArrayList <Car>();
carList.add(ford);
carList.add(fiat);
carList.add(subaru);
carList.add(bmw);
carList.add(new Car("mercedes",250));//böyle de yapılabilir
for (Car c : carList) {
System.out.println(c);
}
System.out.println();
Collections.sort(carList);
System.out.println("Comparable Sorting");
for (Car c : carList) {
System.out.println(c);
}
}
}
Yukarıda Comparable yapısını anlatmaya çalıştık Gerekli yerlerde yorum satırlarıyla kodlarımızı destekledik. Umarız anlamanıza yardımcı olmuştur. Şimdi de Comparator yapısına geçelim. Bunun için yine kodumuzu yazıp içerisini yorum satırlarıyla desteklemeye çalışacağız.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Car {
public Car() {
//hatırlarsanız eğer herhangi bir constructor
//tanımlamazsak otomatik oluşuyordu .
}
public Car(String marka, Integer fiyat) {
super();
this.marka = marka;
this.fiyat = fiyat;
}
String marka;
Integer fiyat;
@Override
public String toString() {
return "Car ["+ " marka=" + marka + ", fiyat=" + fiyat + "]";
}
}
public class ComparatorTest implements Comparator<Car> {
// Doğal sıralama için Comparable , bundan farklı
//bir sıralama içinse comparator kullanılır
public static void main(String[] args) {
Car ford = new Car("ford", 100);
Car fiat = new Car( "fiat", 50);
Car subaru = new Car("subaru", 5000);
Car bmw = new Car("bmw", 1000);
List<Car> carList = new ArrayList <Car>();
carList.add(ford);
carList.add(fiat);
carList.add(subaru);
carList.add(bmw);
for (Car c : carList) {
System.out.println(c);
}
System.out.println();
ComparatorTest comparatorTest = new ComparatorTest();
// overloaded sort metodunu kullanabiliriz.
// burada 1.arguman siralamak istedigimiz List
// 2.arguman ise Comparator arabirimini uygulayan sinifimiz olacaktir.
Collections.sort(carList, comparatorTest);
//Arrays.sort metodu da gerekli kodlamalarla kullanılabilir
System.out.println("Comparator Sorting");
for (Car c : carList) {
System.out.println(c);
}
}
// Comparator -> compare metodunu override etmemiz gerekir
// Comparable -> compareTo metoduydu.
@Override
public int compare(Car car1, Car car2) {
return car2.fiyat.compareTo(car1.fiyat);
//tersten sıralamak için car1 ile car2 yer değiştirilmeli
}
}
Bugünkü konumuz ArrayListelerde sıralama olacak, fakat bu sıralamalarımız basit manada String veya int sıralamak değil de , bir önceki yazımızda bahsettiğimiz objeler arasında sıralama olacaktır. Ne demek istiyoruz peki , elimizde bir tip değişken var. Örneğin int[] dizi={1,4,2,3}; gibi bir dizi olsun elimizde bunu nasıl sıralıyorduk Arrays.sort(dizi) yazıyorduk ve sıralama yapıyorduk. ArrayListlerde de buna benzer bir olay var. Orda Collection.sort() diye sıralama yapıyoruz, fakat bazen karşımıza bir sınıf geldiğini ve bunun birden fazla değişkeni olduğunu düşünelim hangisine göre sıralama yapacağı ise muallakta kalacağı için işte tam bu noktada comporable ve comparator devreye girer. Şimdi kodumuz üzerinden gidelim. Umarım bu sayede daha iyi pekişecektir söylemeye çalıştıklarımız.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Car implements Comparable <Car>{
//<Car> enerjik ile sınırlama getiriyor
//Sınırlama koymak istemezsek comporTo metodunda
//değişiklik yapmak zorundayız.Car yerine Object tanımlanmalı
public Car(String marka, Integer fiyat) {
super();
this.marka = marka;
this.fiyat = fiyat;
}
String marka;
Integer fiyat;
@Override
public int compareTo(Car car) {
return fiyat.compareTo(car.fiyat);
//eğer ters sıralama yapmak istersek
//car.fiyat.compareTo(fiyat);
//markaya göre sıralama yapmak içinse
//return marka.compareTo(car.marka);
}
//burada compareTo ile neye göre sıralama
//yapmak istediğimizi override etmezsek hata alırız
@Override
public String toString() {
return "Car [ marka=" + marka + ", fiyat=" + fiyat + "]";
}
}
public class ComparableTest {
public static void main(String[] args) {
Car ford = new Car("ford", 100);
Car fiat = new Car( "fiat", 50);
Car subaru = new Car("subaru", 5000);
Car bmw = new Car("bmw", 1000);
List <Car> carList = new ArrayList <Car>();
carList.add(ford);
carList.add(fiat);
carList.add(subaru);
carList.add(bmw);
carList.add(new Car("mercedes",250));//böyle de yapılabilir
for (Car c : carList) {
System.out.println(c);
}
System.out.println();
Collections.sort(carList);
System.out.println("Comparable Sorting");
for (Car c : carList) {
System.out.println(c);
}
}
}
Yukarıda Comparable yapısını anlatmaya çalıştık Gerekli yerlerde yorum satırlarıyla kodlarımızı destekledik. Umarız anlamanıza yardımcı olmuştur. Şimdi de Comparator yapısına geçelim. Bunun için yine kodumuzu yazıp içerisini yorum satırlarıyla desteklemeye çalışacağız.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Car {
public Car() {
//hatırlarsanız eğer herhangi bir constructor
//tanımlamazsak otomatik oluşuyordu .
}
public Car(String marka, Integer fiyat) {
super();
this.marka = marka;
this.fiyat = fiyat;
}
String marka;
Integer fiyat;
@Override
public String toString() {
return "Car ["+ " marka=" + marka + ", fiyat=" + fiyat + "]";
}
}
public class ComparatorTest implements Comparator<Car> {
// Doğal sıralama için Comparable , bundan farklı
//bir sıralama içinse comparator kullanılır
public static void main(String[] args) {
Car ford = new Car("ford", 100);
Car fiat = new Car( "fiat", 50);
Car subaru = new Car("subaru", 5000);
Car bmw = new Car("bmw", 1000);
List<Car> carList = new ArrayList <Car>();
carList.add(ford);
carList.add(fiat);
carList.add(subaru);
carList.add(bmw);
for (Car c : carList) {
System.out.println(c);
}
System.out.println();
ComparatorTest comparatorTest = new ComparatorTest();
// overloaded sort metodunu kullanabiliriz.
// burada 1.arguman siralamak istedigimiz List
// 2.arguman ise Comparator arabirimini uygulayan sinifimiz olacaktir.
Collections.sort(carList, comparatorTest);
//Arrays.sort metodu da gerekli kodlamalarla kullanılabilir
System.out.println("Comparator Sorting");
for (Car c : carList) {
System.out.println(c);
}
}
// Comparator -> compare metodunu override etmemiz gerekir
// Comparable -> compareTo metoduydu.
@Override
public int compare(Car car1, Car car2) {
return car2.fiyat.compareTo(car1.fiyat);
//tersten sıralamak için car1 ile car2 yer değiştirilmeli
}
}
ArrayList
S.a. Arkadaşlar,
Bugünkü konumuz ArrayList olacak. Dizileri hepimiz biliyoruzdur. Dizilerde ne yapıyorduk eleman tutuyorduk,siliyorduk vs fakat burada bir diziye tek bir tip değişken atayabiliyorduk. Mesela int[] a= new int[size]; diyorduk ve sadece intenger tanımlayabiliyorduk. Fakat arraylistlerde farklı tipleri tanımlama olanağı sağlar fakat siz bunu istemezseniz jenerikler ile de kısıtlama yapabiliyorsunuz. Jenerik konusunu ileri ki konularda anlatacağız inşallah, fakat bir nevi tip kısıtlaması dersek şuan için bize yeterli olacağını düşünüyorum. Ayrıca arraylistler dinamik yapılardır. Eleman ekledikçe genişleyen sildikçe küçülen yapılardır. Dizilerde sabit bir boyut veriyorduk bildiğiniz gibi ve bundan fazla eleman ekleme şansımız olmuyordu. Daha az eleman eklediğimizde ise boşuna bellekte yer tutmuş oluyoruz. ArrayListlerin böyle bir avantajı da var. Son olarak eleman silme gibi işlemler veya araya eleman ekleme gibi konularında diziler için ekstra kod yazmanız gerekirken ArrayListler bunu kendisi hallediyor ve size bir zorluk çıkarmıyor. Sayılar ve String için sıralama yapabiliyor, fakat farklı objeler için sıralama yapamıyor. Mesela bir Car sınıfımız var , onun için farklı yöntemler var onları da ileride nasip olursa anlatırız. Şimdilik teknik olarak söyleyeceklerimiz bunlar. Kodlar içerisinde eksik gördüğümüz yerleri yine anlatmaya çalışacağız. Şimdi yavaştan kod kısmına geçelim.
public static void main(String[] args) {
ArrayList myArrayList = new ArrayList();
// ArrayList'e elemani add metodu ile ekleyebiliriz.
myArrayList.add(10);
myArrayList.add((short)20);
myArrayList.add("test");
myArrayList.add(true);
myArrayList.add(new Test());//paketismi+sıfınismi+@id
myArrayList.set(2, "new set text");//set ile indexteki elemani override
myArrayList.add(1, '#');//overload ile yeni eleman ekleyebiliriz
//set ile farkı elemanı üzerine yazılmaz, elemanı aşağı kaydırır.
for (Object obje: myArrayList) {
System.out.println(obje);
}
boolean isEmpty = myArrayList.isEmpty();//ArrayList Boş mu,boşsa true
int size = myArrayList.size(); // kaç elemanlı
System.out.println(isEmpty + " Eleman Sayısı: " + size);
boolean b= myArrayList.contains(20);//burada int olduğu için false
boolean b2= myArrayList.contains((short)20); //short olduğundan true
boolean b3= myArrayList.contains("10"); //yukarıda int burada String!
System.out.println(b+ " " + b2+ " " + b3);
int indexOf = myArrayList.indexOf(10); //indexini atar
int indexOf2 = myArrayList.indexOf(20); //int olduğundan -1 döndürür
int indexOf3 = myArrayList.indexOf((short)20);
System.out.println(indexOf + " " + indexOf2 + " " + indexOf3);
myArrayList.remove(0); //index siler
System.out.println("0.eleman Silindikten Sonra:" + myArrayList.size());
myArrayList.clear(); //tüm arraylisti siler
System.out.println("Dizi tamamen silinince" + myArrayList.size());
//şimdi diziyi tekrar yazdıralım,görüldüğü üzere birşey yazmaz
for (Object obje: myArrayList) {
System.out.println(obje);
}
}
Peki biz array ile arrayList arasında herhangi bir dönüşüm yapabilir miyiz diye bir soru sorarsak onun da cevabı evet olacak. Her iki dönüşüme de izin veriyor. Bunun için birden fazla yol olabilir fakat biz kendiliğinden gelen toArray ve asListleri kullanacağız. Bu iki yöntem arasında farklar vardır. Bunları burada söylemektense kod içerisinde uygularken yorum satırlarıyla desteklemeyi tercih edelim.
public static void main(String[] args) {
String[] namesArray = { "names1", "names2", "names3", "names4" };
List namesList = Arrays.asList(namesArray);
// Arrays -> List dönüşümü yapıyoruz
for (String str : namesArray) {
System.out.print(str + " ");
}
// List'teki elemani guncellersek otomatik olarak
//dizi arraydeki eleman da guncellenecektir.
//fakat toArray ile güncellenme olmayacaktır
namesList.set(0, "set new names1");
System.out.println("");
for (String str : namesArray) {
System.out.print(str + " ");
}
// namesList.add("java.lang.UnsupportedOperationException");
//bu şekilde eleman eklemeyiz fakat to Array bu böyle değildir
}
NOT: adList ile toArray görev olarak aynı olsa dahi özellik olarak birbirlerinin tersi gibidirler. Kodun içinde gerekli açıklamaları yapmaya özen gösterdik. Yazımızı burada son veriyor , iyi çalışmalar diliyoruz.
Bugünkü konumuz ArrayList olacak. Dizileri hepimiz biliyoruzdur. Dizilerde ne yapıyorduk eleman tutuyorduk,siliyorduk vs fakat burada bir diziye tek bir tip değişken atayabiliyorduk. Mesela int[] a= new int[size]; diyorduk ve sadece intenger tanımlayabiliyorduk. Fakat arraylistlerde farklı tipleri tanımlama olanağı sağlar fakat siz bunu istemezseniz jenerikler ile de kısıtlama yapabiliyorsunuz. Jenerik konusunu ileri ki konularda anlatacağız inşallah, fakat bir nevi tip kısıtlaması dersek şuan için bize yeterli olacağını düşünüyorum. Ayrıca arraylistler dinamik yapılardır. Eleman ekledikçe genişleyen sildikçe küçülen yapılardır. Dizilerde sabit bir boyut veriyorduk bildiğiniz gibi ve bundan fazla eleman ekleme şansımız olmuyordu. Daha az eleman eklediğimizde ise boşuna bellekte yer tutmuş oluyoruz. ArrayListlerin böyle bir avantajı da var. Son olarak eleman silme gibi işlemler veya araya eleman ekleme gibi konularında diziler için ekstra kod yazmanız gerekirken ArrayListler bunu kendisi hallediyor ve size bir zorluk çıkarmıyor. Sayılar ve String için sıralama yapabiliyor, fakat farklı objeler için sıralama yapamıyor. Mesela bir Car sınıfımız var , onun için farklı yöntemler var onları da ileride nasip olursa anlatırız. Şimdilik teknik olarak söyleyeceklerimiz bunlar. Kodlar içerisinde eksik gördüğümüz yerleri yine anlatmaya çalışacağız. Şimdi yavaştan kod kısmına geçelim.
public static void main(String[] args) {
ArrayList myArrayList = new ArrayList();
// ArrayList'e elemani add metodu ile ekleyebiliriz.
myArrayList.add(10);
myArrayList.add((short)20);
myArrayList.add("test");
myArrayList.add(true);
myArrayList.add(new Test());//paketismi+sıfınismi+@id
myArrayList.set(2, "new set text");//set ile indexteki elemani override
myArrayList.add(1, '#');//overload ile yeni eleman ekleyebiliriz
//set ile farkı elemanı üzerine yazılmaz, elemanı aşağı kaydırır.
for (Object obje: myArrayList) {
System.out.println(obje);
}
boolean isEmpty = myArrayList.isEmpty();//ArrayList Boş mu,boşsa true
int size = myArrayList.size(); // kaç elemanlı
System.out.println(isEmpty + " Eleman Sayısı: " + size);
boolean b= myArrayList.contains(20);//burada int olduğu için false
boolean b2= myArrayList.contains((short)20); //short olduğundan true
boolean b3= myArrayList.contains("10"); //yukarıda int burada String!
System.out.println(b+ " " + b2+ " " + b3);
int indexOf = myArrayList.indexOf(10); //indexini atar
int indexOf2 = myArrayList.indexOf(20); //int olduğundan -1 döndürür
int indexOf3 = myArrayList.indexOf((short)20);
System.out.println(indexOf + " " + indexOf2 + " " + indexOf3);
myArrayList.remove(0); //index siler
System.out.println("0.eleman Silindikten Sonra:" + myArrayList.size());
myArrayList.clear(); //tüm arraylisti siler
System.out.println("Dizi tamamen silinince" + myArrayList.size());
//şimdi diziyi tekrar yazdıralım,görüldüğü üzere birşey yazmaz
for (Object obje: myArrayList) {
System.out.println(obje);
}
}
Peki biz array ile arrayList arasında herhangi bir dönüşüm yapabilir miyiz diye bir soru sorarsak onun da cevabı evet olacak. Her iki dönüşüme de izin veriyor. Bunun için birden fazla yol olabilir fakat biz kendiliğinden gelen toArray ve asListleri kullanacağız. Bu iki yöntem arasında farklar vardır. Bunları burada söylemektense kod içerisinde uygularken yorum satırlarıyla desteklemeyi tercih edelim.
public static void main(String[] args) {
String[] namesArray = { "names1", "names2", "names3", "names4" };
List namesList = Arrays.asList(namesArray);
// Arrays -> List dönüşümü yapıyoruz
for (String str : namesArray) {
System.out.print(str + " ");
}
// List'teki elemani guncellersek otomatik olarak
//dizi arraydeki eleman da guncellenecektir.
//fakat toArray ile güncellenme olmayacaktır
namesList.set(0, "set new names1");
System.out.println("");
for (String str : namesArray) {
System.out.print(str + " ");
}
// namesList.add("java.lang.UnsupportedOperationException");
//bu şekilde eleman eklemeyiz fakat to Array bu böyle değildir
}
NOT: adList ile toArray görev olarak aynı olsa dahi özellik olarak birbirlerinin tersi gibidirler. Kodun içinde gerekli açıklamaları yapmaya özen gösterdik. Yazımızı burada son veriyor , iyi çalışmalar diliyoruz.
19 Ocak 2015 Pazartesi
Enum
S.a. Arkadaşlar,
Bugünkü yazımız enumlar olacak , belki daha önce anlatmam gereken veya yer yer bahsettiğim bir konu olduğu halde , tekrardan hem bir başlık altında toplamak hem de atladığım, gözden kaçırdığım yer olursa onları da almak adına enumlar adında bir yazı yazalım dedik. Peki nedir enumlar ? Sabitlerin değerleri temsil ederler. Fakat bunu yaparken daha derli toplu, anlaşılır bir halde yaparlar. Bu nedenle bu yapıyı kullanırız. Java'ya da 1.5 sürümüyle eklenmiştir, daha öncesinde dediğimiz gibi sabitler (constant) kullanılırdı. Kısaca bir örnek yapacak olursak;
public class TrafikLambasi {
public static final int GREEN = 1;
public static final int YELLOW = 0;
public static final int RED = -1;
}
yerine kısaca
enum TrafficLight {
GREEN(1),YELLOW(0), RED(-1);
TrafficLight(int value) { //int yerine farklı değişkenler tanımlanabilir.
//GREEN(değişken türüne değer atanır)
}
yazabiliriz. Şuan durum o kadar da karışık değil çünkü sadece 3 değişkenimiz var. Mesela bu aylar gibi 12 değişken veya farklı yapıda belki yüzlerce değişken kullanacağımız bir proje olsa, ne demek istediğimiz daha iyi anlaşılırdı. Böylece enumla bu karışıklığın önüne geçiyoruz. Şimdi de aşağıda yazdığımız kodda enumlarla ilgili temel şeyler yazmaya çalıştık. Kafanıza takılan şeyleri siz de kodun üzerinde farklı işlemler yaparak aklınızdaki soruları gidermeye çalışın , böylece daha iyi oturtacağınıza inanıyoruz.
enum Outer { //enum dışarıda tanımladığında sadece default ve public alabilir
//implements alabilir interfacelerden fakat extends ile kalıtım yapamaz
SHORT, NORMAL, TALL;
Outer(){
//class ve abstract sınıflar gibi constructor tanımlanailir
// ama hatırlarsanız interfacelerde constuctor tanımlayamıyorduk
}
}; //noktalı virgül zorunlu değil
class JavaCoffee {
protected enum Inner{ //içeride tanımlanırsa private ve protected de alabilir
SHORT1,NORMAL1,TALL1;
static enum InnerEnumClass{
//iç içe enum tanımlanailir, static de olabilir
}
Inner() {
//constructora public gelemez. Nedeni enum protected olmasıdır.
//ya aynısı ya da daha gizlisi olmalıdır !! bunu da tekrar hatırlattık
}
}; // noktalı virgül zorunlu değil
Outer size;
Inner size1;
static void metod(){
//enum InMetod{} , metodlar içinde tanımlanamazlar
}
}
public class JavaCoffeeTest {
public static void main(String[] args) {
JavaCoffee coffee = new JavaCoffee();
//Outer outer = new Outer(); yeni obje oluşturulmaz
//enum sınıf dışında tanımlanırken
coffee.size = Outer.NORMAL;
System.out.println(coffee.size);
//senum sınıf içinde tanımlanırken
coffee.size1 = JavaCoffee.Inner.TALL1;
System.out.println(coffee.size1);
}
}
Bugünkü yazımız enumlar olacak , belki daha önce anlatmam gereken veya yer yer bahsettiğim bir konu olduğu halde , tekrardan hem bir başlık altında toplamak hem de atladığım, gözden kaçırdığım yer olursa onları da almak adına enumlar adında bir yazı yazalım dedik. Peki nedir enumlar ? Sabitlerin değerleri temsil ederler. Fakat bunu yaparken daha derli toplu, anlaşılır bir halde yaparlar. Bu nedenle bu yapıyı kullanırız. Java'ya da 1.5 sürümüyle eklenmiştir, daha öncesinde dediğimiz gibi sabitler (constant) kullanılırdı. Kısaca bir örnek yapacak olursak;
public class TrafikLambasi {
public static final int GREEN = 1;
public static final int YELLOW = 0;
public static final int RED = -1;
}
yerine kısaca
enum TrafficLight {
GREEN(1),YELLOW(0), RED(-1);
TrafficLight(int value) { //int yerine farklı değişkenler tanımlanabilir.
//GREEN(değişken türüne değer atanır)
}
yazabiliriz. Şuan durum o kadar da karışık değil çünkü sadece 3 değişkenimiz var. Mesela bu aylar gibi 12 değişken veya farklı yapıda belki yüzlerce değişken kullanacağımız bir proje olsa, ne demek istediğimiz daha iyi anlaşılırdı. Böylece enumla bu karışıklığın önüne geçiyoruz. Şimdi de aşağıda yazdığımız kodda enumlarla ilgili temel şeyler yazmaya çalıştık. Kafanıza takılan şeyleri siz de kodun üzerinde farklı işlemler yaparak aklınızdaki soruları gidermeye çalışın , böylece daha iyi oturtacağınıza inanıyoruz.
enum Outer { //enum dışarıda tanımladığında sadece default ve public alabilir
//implements alabilir interfacelerden fakat extends ile kalıtım yapamaz
SHORT, NORMAL, TALL;
Outer(){
//class ve abstract sınıflar gibi constructor tanımlanailir
// ama hatırlarsanız interfacelerde constuctor tanımlayamıyorduk
}
}; //noktalı virgül zorunlu değil
class JavaCoffee {
protected enum Inner{ //içeride tanımlanırsa private ve protected de alabilir
SHORT1,NORMAL1,TALL1;
static enum InnerEnumClass{
//iç içe enum tanımlanailir, static de olabilir
}
Inner() {
//constructora public gelemez. Nedeni enum protected olmasıdır.
//ya aynısı ya da daha gizlisi olmalıdır !! bunu da tekrar hatırlattık
}
}; // noktalı virgül zorunlu değil
Outer size;
Inner size1;
static void metod(){
//enum InMetod{} , metodlar içinde tanımlanamazlar
}
}
public class JavaCoffeeTest {
public static void main(String[] args) {
JavaCoffee coffee = new JavaCoffee();
//Outer outer = new Outer(); yeni obje oluşturulmaz
//enum sınıf dışında tanımlanırken
coffee.size = Outer.NORMAL;
System.out.println(coffee.size);
//senum sınıf içinde tanımlanırken
coffee.size1 = JavaCoffee.Inner.TALL1;
System.out.println(coffee.size1);
}
}
16 Ocak 2015 Cuma
Tokenizing & Formating
Bugünkü konumuzda tokenizing ve formating
konusunu işleyeceğiz. Bir önceki konuda regex konusu ile birbirinden yakındır fakat mantık regex bulma işlemi yaparken burada büyük parçalardan küçük
parçalara veya başka bir ifadeyle istenilen formata çevirme yöntemi vardır. Şimdi örneğimize geçersek ne demek istediğimizi daha
iyi anlarız
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);
}
//burada virgüle göre parçalama yapıyoruz
content = "name1,name2:name3:name4.name5@name6";
System.out.println("virgul - iki nokta-nokta- @");
names = content.split(",|:|\\.|@");
// onceki yazida isledigimiz gibi ,birden fazla bölme parametresi de kullanabiliriz
// benzer sekilde noktayi kullanmak icin kacis karakteriyle kullanılmalıdır. \\.
for (String s : names) {
System.out.println(s);
}
}
}
Gördüğünüz gibi buradaki bir bütün olan metni kelimeler ayırdık. Bu ayırma işlemi boşluklara göre de
olabilirdi. Her boşlukta kelimeyi hafızaya alıp yazdırabilirdik veya satır satır alma işlemi de olaiblirdi.
Satır sonuna gelindiğinde satırı hafızaya da alabilirdi. Bu tip örnekler çoğaltılabilir tabii ki de ..
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);
}
//burada virgüle göre parçalama yapıyoruz
content = "name1,name2:name3:name4.name5@name6";
System.out.println("virgul - iki nokta-nokta- @");
names = content.split(",|:|\\.|@");
// onceki yazida isledigimiz gibi ,birden fazla bölme parametresi de kullanabiliriz
// benzer sekilde noktayi kullanmak icin kacis karakteriyle kullanılmalıdır. \\.
for (String s : names) {
System.out.println(s);
}
}
}
Gördüğünüz gibi buradaki bir bütün olan metni kelimeler ayırdık. Bu ayırma işlemi boşluklara göre de
olabilirdi. Her boşlukta kelimeyi hafızaya alıp yazdırabilirdik veya satır satır alma işlemi de olaiblirdi.
Satır sonuna gelindiğinde satırı hafızaya da alabilirdi. Bu tip örnekler çoğaltılabilir tabii ki de ..
Aşağıdaki kodda ise tokenizin işlemi ile searching işleminin arasındaki farkı daha iyi anlaycağınızı umuyorum.
public static void main(String[] args) {
Pattern p = Pattern.compile("\\s");//boşluk
String content = "merhaba java!";
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("\\s");
System.out.println("Tokenizing Test");
for (String token : tokens) {
System.out.println(token);
// Split/tokenizing ise regexe göre parçalama işlemidir
}
}
}
Şimdi de formating konusunda bakalım. Formating C'den yabancı olmadığımız bir konu. Aynı şey java için de
geçerlidir. b boolean , c char, d integer, f floating point, s string kullanılır. Birazdan örneklerde göreceğimiz
şekilde bu tanımlamalar böyle yapılır. Şimdi örnek kodumuza geçelim.
public static void main(String[] args) {
System.out.printf("%d", 10);
System.out.println();
System.out.format("%d", 10);//format metonu da kullanabiliriz
System.out.println();
//System.out.printf("%f",10);
// java.util.IllegalFormatConversionException hatasi verecektir.
// %f kayan noktali sayilar/kusuratli sayilar icindir.
System.out.printf("%2$d %1$d %3$f", 123, 456, 10.4);
// index$ ifadesi ile arguman olarak verilen ddeğerleri düzenleyebiliriz.
System.out.println();//456 123 10.4
System.out.printf("%05d", 123);
// 0 , metoda sayimizin hanesini belirtir
// sayımız 5 haneden büyükse her hangi bir değişiklik yapmaz
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.
}
Şimdi de formating konusunda bakalım. Formating C'den yabancı olmadığımız bir konu. Aynı şey java için de
geçerlidir. b boolean , c char, d integer, f floating point, s string kullanılır. Birazdan örneklerde göreceğimiz
şekilde bu tanımlamalar böyle yapılır. Şimdi örnek kodumuza geçelim.
public static void main(String[] args) {
System.out.printf("%d", 10);
System.out.println();
System.out.format("%d", 10);//format metonu da kullanabiliriz
System.out.println();
//System.out.printf("%f",10);
// java.util.IllegalFormatConversionException hatasi verecektir.
// %f kayan noktali sayilar/kusuratli sayilar icindir.
System.out.printf("%2$d %1$d %3$f", 123, 456, 10.4);
// index$ ifadesi ile arguman olarak verilen ddeğerleri düzenleyebiliriz.
System.out.println();//456 123 10.4
System.out.printf("%05d", 123);
// 0 , metoda sayimizin hanesini belirtir
// sayımız 5 haneden büyükse her hangi bir değişiklik yapmaz
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.
}
15 Ocak 2015 Perşembe
Regex-Searching&Finding
Bugünkü yazımızda birbirinden farklı fakat birbiriyle yakın konuları işleyeceğiz. Regex konusu ile başlayalım hemen , aşağıdaki örnekte yorum satırlarında açıklamalar var. Kafanızı karıştırmadan umarım sadece ve anlaşılır olabilir
public static void main(String[] args) {
Pattern p = Pattern.compile("a");//birden fazla harf de olabilir
// ilgili icerikte/content "www.java.com.tr" "a" harfini arar
Matcher m = p.matcher("www.java.com.tr");
while (m.find()) { //bu işlemler 1 kez çalışır!!
System.out.print(m.start() + " ");
}
System.out.println();
Pattern p3 = Pattern.compile("j|w|t");//"[jwt]" yapıların aynıdır
// arama yaparken or yapısını | ile kullanabiliriz
Matcher m3 = p3.matcher("www.java.com.tr");
while (m3.find()) {
System.out.print(m3.start() + " ");
}
System.out.println();
Pattern p5 = Pattern.compile("[jwt][ar]");
// ilk 3 karekterden herhanginden biri sonrası
//sonraki a veya r'den biri gelmelidir
Matcher m5 = p5.matcher("www.java.com.tr");
while (m5.find()) {
System.out.print(m5.start() + " ");
}
System.out.println();
Pattern p6 = Pattern.compile("[a-z]");
// a-z arasında tüm karekterleri alır
//dikkat edin noktaları ve 'R' almaz
//aynı şey rakamlar için de geçerlidir
Matcher m6 = p6.matcher("www.java.com.tR");
while (m6.find()) {
System.out.print(m6.start() + " ");
}
System.out.println();
Pattern p8 = Pattern.compile("[^ajw]");
// caret ajw dışındakileri bul demektir. Değilini almak gibi
Matcher m8 = p8.matcher("www.java.com.tr");
while (m8.find()) {
System.out.print(m8.start() + " ");
}
}
Yukarıda bazı ifadeler görüyoruz. Örneğin ; [a-z] bu ne demekti , a ile z arasındaki tüm karekteri al , veya [0-9] tüm rakamları al demektir. Peki bunun kısa bir yolu yok mu ? Onun için de matekarekter diye ifade ettiğimiz bir kavram var. Şimdi onu verelim . Ondan sonra da bir örnekle konuyu daha iyi inceleyelim
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
// \d -> [0-9] anlamina gelmektedir.
// \\D -> [0-9] dışındaki karekterleri içerir
Matcher m = p.matcher("java1 reg2ex!");
while (m.find()) {
System.out.print(m.start() + " ");
}
Pattern p3 = Pattern.compile("\\s");
// \s -> bosluk karakterini bulur.
// \SS -> boşluk dışındakileri bulur
Matcher m3 = p3.matcher("java1 reg2ex!");
System.out.println();
while (m3.find()) {
System.out.print(m3.start() + " ");
}
Pattern p5 = Pattern.compile("\\w");
// \w -> harf veya rakam
// \\W-> harf ve rakam dışındakiler
Matcher m5 = p5.matcher("java1 reg2ex!");
System.out.println();
while (m5.find()) {
System.out.print(m5.start() + " ");
}
Pattern p7 = Pattern.compile("a.c");
// . karekteri buraya her hangi bir karekter gelebilir demektir
Matcher m7 = p7.matcher("ac abc a c a d");
// ac yi almaz cunku arada bir karakter yok.
// abc , a c yi alır . ac almaz arada birşey yoktur
System.out.println();
while (m7.find()) {
System.out.print(m7.start() + " ");
}
}
Şimdi de bu ifadelerin sayıları ile ilgili bir örnek verelim. Mesela ab'den sonra kaç tane karekter gelebilir veya ab'den sonra her hangi birşey gelsin mi gelmesin gibi şeyler de talep edilebilmektir. Bunun için + ? * gibi ifadeler yer almaktadır. Şimdi örnekteki kodda ne demek istediğimizi umarız daha iyi anlatabiliriz.
public static void main(String[] args) {
Pattern p = Pattern.compile("\\w");
Matcher m = p.matcher("1 a12 234b");
while (m.find()) {
System.out.println("start : " + m.start() + " end :" +
m.end() + " content:" + m.group());
// start metodu match/eslesen regex icin baslangic indexi verir.
// end metodu match/eslesen regex icin baslangic indexi verir.
// group metodu match/eslesen regexi verir.
}
Pattern p2 = Pattern.compile("\\d+");
// + karakteri 1 veya daha fazlası
// * karekteri 0 veya daha fazlası
// ? 0 veya 1 tane anlamına gelir
// \\d{n} n tane rakam içermesine bakar
Matcher m2 = p2.matcher("1 a12 234b");
System.out.println("one or more");
while (m2.find()) {
System.out.println("start : " + m2.start() + " end :" +
m2.end() + " content:" + m2.group());
}
//burada karışık bir örnek var. Siz de böyle çalışmalar yapabilirsiniz
Pattern p5 = Pattern.compile("0[xX][0-9a-fA-F]");
// 0 ile baslasin 2.karakter x veya X olsun sonrasinda rakam(0-9)
//ya da a-f ya da A-F arasinda harf olsun.
Matcher m5 = p5.matcher("12 0x 0x12 0Xf 0xg");
System.out.println("more regex");
while (m5.find()) {
System.out.println("start : " + m5.start() + " end :" +
m5.end() + " content:" + m5.group());
}
}
public static void main(String[] args) {
Pattern p = Pattern.compile("a");//birden fazla harf de olabilir
// ilgili icerikte/content "www.java.com.tr" "a" harfini arar
Matcher m = p.matcher("www.java.com.tr");
while (m.find()) { //bu işlemler 1 kez çalışır!!
System.out.print(m.start() + " ");
}
System.out.println();
Pattern p3 = Pattern.compile("j|w|t");//"[jwt]" yapıların aynıdır
// arama yaparken or yapısını | ile kullanabiliriz
Matcher m3 = p3.matcher("www.java.com.tr");
while (m3.find()) {
System.out.print(m3.start() + " ");
}
System.out.println();
Pattern p5 = Pattern.compile("[jwt][ar]");
// ilk 3 karekterden herhanginden biri sonrası
//sonraki a veya r'den biri gelmelidir
Matcher m5 = p5.matcher("www.java.com.tr");
while (m5.find()) {
System.out.print(m5.start() + " ");
}
System.out.println();
Pattern p6 = Pattern.compile("[a-z]");
// a-z arasında tüm karekterleri alır
//dikkat edin noktaları ve 'R' almaz
//aynı şey rakamlar için de geçerlidir
Matcher m6 = p6.matcher("www.java.com.tR");
while (m6.find()) {
System.out.print(m6.start() + " ");
}
System.out.println();
Pattern p8 = Pattern.compile("[^ajw]");
// caret ajw dışındakileri bul demektir. Değilini almak gibi
Matcher m8 = p8.matcher("www.java.com.tr");
while (m8.find()) {
System.out.print(m8.start() + " ");
}
}
Yukarıda bazı ifadeler görüyoruz. Örneğin ; [a-z] bu ne demekti , a ile z arasındaki tüm karekteri al , veya [0-9] tüm rakamları al demektir. Peki bunun kısa bir yolu yok mu ? Onun için de matekarekter diye ifade ettiğimiz bir kavram var. Şimdi onu verelim . Ondan sonra da bir örnekle konuyu daha iyi inceleyelim
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
// \d -> [0-9] anlamina gelmektedir.
// \\D -> [0-9] dışındaki karekterleri içerir
Matcher m = p.matcher("java1 reg2ex!");
while (m.find()) {
System.out.print(m.start() + " ");
}
Pattern p3 = Pattern.compile("\\s");
// \s -> bosluk karakterini bulur.
// \SS -> boşluk dışındakileri bulur
Matcher m3 = p3.matcher("java1 reg2ex!");
System.out.println();
while (m3.find()) {
System.out.print(m3.start() + " ");
}
Pattern p5 = Pattern.compile("\\w");
// \w -> harf veya rakam
// \\W-> harf ve rakam dışındakiler
Matcher m5 = p5.matcher("java1 reg2ex!");
System.out.println();
while (m5.find()) {
System.out.print(m5.start() + " ");
}
Pattern p7 = Pattern.compile("a.c");
// . karekteri buraya her hangi bir karekter gelebilir demektir
Matcher m7 = p7.matcher("ac abc a c a d");
// ac yi almaz cunku arada bir karakter yok.
// abc , a c yi alır . ac almaz arada birşey yoktur
System.out.println();
while (m7.find()) {
System.out.print(m7.start() + " ");
}
}
Şimdi de bu ifadelerin sayıları ile ilgili bir örnek verelim. Mesela ab'den sonra kaç tane karekter gelebilir veya ab'den sonra her hangi birşey gelsin mi gelmesin gibi şeyler de talep edilebilmektir. Bunun için + ? * gibi ifadeler yer almaktadır. Şimdi örnekteki kodda ne demek istediğimizi umarız daha iyi anlatabiliriz.
public static void main(String[] args) {
Pattern p = Pattern.compile("\\w");
Matcher m = p.matcher("1 a12 234b");
while (m.find()) {
System.out.println("start : " + m.start() + " end :" +
m.end() + " content:" + m.group());
// start metodu match/eslesen regex icin baslangic indexi verir.
// end metodu match/eslesen regex icin baslangic indexi verir.
// group metodu match/eslesen regexi verir.
}
Pattern p2 = Pattern.compile("\\d+");
// + karakteri 1 veya daha fazlası
// * karekteri 0 veya daha fazlası
// ? 0 veya 1 tane anlamına gelir
// \\d{n} n tane rakam içermesine bakar
Matcher m2 = p2.matcher("1 a12 234b");
System.out.println("one or more");
while (m2.find()) {
System.out.println("start : " + m2.start() + " end :" +
m2.end() + " content:" + m2.group());
}
//burada karışık bir örnek var. Siz de böyle çalışmalar yapabilirsiniz
Pattern p5 = Pattern.compile("0[xX][0-9a-fA-F]");
// 0 ile baslasin 2.karakter x veya X olsun sonrasinda rakam(0-9)
//ya da a-f ya da A-F arasinda harf olsun.
Matcher m5 = p5.matcher("12 0x 0x12 0Xf 0xg");
System.out.println("more regex");
while (m5.find()) {
System.out.println("start : " + m5.start() + " end :" +
m5.end() + " content:" + m5.group());
}
}
14 Ocak 2015 Çarşamba
Tarih&Saat İşlemleri
Bugünkü
konumuz tarihler. Tarihlerle ilgili farklı paket,sınıf ve metodlar
inceleyeceğiz. Hangisinin nerede kullanılması veya hangi koşullarda sizin
işinizi görecek olanı seçmek ise size kalmış. Sözü fazla uzatmadan date
sınıfını inceleyelim. Date sınıfında eskiyen bir çok metod vardır , fakat
bununla birlikte hala kullanılan önemli metodlar vardır. Biz örneklerimizi
incelemeye başlayalım.
public
static void main(String[] args) {
Date
date = new Date();
long
time = date.getTime();
System.out.println(time);
//1970'dan şuana milli saniye
long
now = System.currentTimeMillis();
System.out.println(now);//aynı
işlev
Date
date2 = new Date(now);
System.out.println(date2);
//Ayrıntılı Tarih
int
karsilastir= date.compareTo(date2);
System.out.println(karsilastir);
//burada ise 2 tarihi karsilastirdik
//aynı
olduğundan 0 döner
//negatif olsa soldaki daha eski manasındaydı
}
Şimdi de Calendar sınıfını inceleyelim. Date sınıfındaki metodlar java tarafından
eski , tabiri caizse modası geçmiş olarak tabir edilir ve kullanılması tavsiye
edilmez. Derleyici tarafından da üzeri çizikli olur. Onun yerine Calendar
sınıfını kullanılması daha yerinde olur. Fakat Calendar sınıfı soyut bir sınıf
olduğu için Date sınıfındaki Date date= new Date(); diye obje oluşturamayız.
Buraya dikkat etmemizde fayda var.
public static void main(String[]
args) {
Calendar
calendar = Calendar.getInstance();
//Calender calender = new Calendar(); soyut sınıfı olduğundan hata
System.out.println(calendar
instanceof GregorianCalendar);
//GregorianCalender extends Calendar manasındadır.
System.out.println(calendar);
Date
date = calendar.getTime();//kalıtım olduğundan doğru ifade
Date
date2 = new Date();
System.out.println(date
+ "\n" + date2);
//
her iki ifadenin de çıktısı aynıdır
int
year= calendar.get(Calendar.YEAR);//yılı verir
int
month= calendar.get(Calendar.MONTH); //ayı verir
int
day= calendar.get(Calendar.DAY_OF_MONTH);//ayın haftası
int
hour= calendar.get(Calendar.HOUR); //12 saatlik dilimine göre
System.out.println("Yil:" + year + " Ay:" + month +
" Gun:" + day + " Saat:" + hour);
//bu
örnekler tabi ki çoğaltılabilir. ctrl+space siz de görebilirsiniz
}
Şimdi de text.DateFormat ve text.SimpleDataFormat
sınıflarını işleyeceğiz. Date format sınıfı da soyut bir sınıftır. Simple sınıfı
da ondan kalıtıldığı için doğal olarak o da soyut olur ve new objesini kullanamayız,
onun yerine getInsance veya overload moteodlar kullanılır. Aşağıdaki örnekte
göreceksiniz bu iki sınıfla küçük örnekler yaptık. Burada Simple sınıfı bana
çok kullanışlı geldi, fakat sizlerin kullanımına göre tabi bu değişebilir
Son olarak da tarih ve saatlerin formatlanması konusunda bakalım. Gerekli yorumlar kod kısmında yer almaktadır.
public static void main(String[] args) {
NumberFormat numberFormat = NumberFormat.getInstance();
int maxFractionDigits = numberFormat.getMaximumFractionDigits();
// varsayilan olarak 3 tur
int minFractionDigits = numberFormat.getMinimumFractionDigits();
// varsayilan olarak 0 dir
System.out.println("minimum fraction digits :" + minFractionDigits);
System.out.println("maximum fraction digits :" + maxFractionDigits);
double salary = 123.456789;
System.out.println(salary);
System.out.println(numberFormat.format(salary));
numberFormat.setMaximumFractionDigits(5);
// virgulden sonraki kullanilan rakam sayisi maximum 5 olsun.
System.out.println(numberFormat.format(salary));
double salary2 = 123;
System.out.println(salary2); // double sayi icin tek 0 koyacaktir.
numberFormat.setMinimumFractionDigits(2);
// virgulden sonraki kullanilan rakam sayisi minimum 2 olsun.
// eger yoksa 00 olarak ekleyecektir.
System.out.println(numberFormat.format(salary2));
numberFormat.setMaximumIntegerDigits(5);
// virgulden once maximum 5 karakter olsun
numberFormat.setMinimumIntegerDigits(3);
// virgulden once minimum 3 karakter olsun.
System.out.println(numberFormat.format(123456789));
System.out.println(numberFormat.format(89));
}
Şimdi de format ve parse metodlarına bakıp yazımı bitirelim
public static void main(String[] args) {
NumberFormat numberFormat = NumberFormat.getInstance();
// NumberFormat sinifindadki parse Number->String
// NumberFormat sinifindaki format metodu String->Number
// parse metodu ParseException firlatabilir.
try {
System.out.println(numberFormat.parse("123.456789"));
System.out.println(numberFormat.parse("123,456789"));
System.out.println(numberFormat.parse("1a23456789"));
//System.out.println(numberFormat.parse("a123456789"));
System.out.println(numberFormat.format(123.23));
} catch (ParseException e) {
e.printStackTrace();
}
}
}
Kaynak
http://www.injavawetrust.com/pure-java-61-dates-numbers-currency-date-calendar/
http://www.injavawetrust.com/pure-java-62-dates-numbers-currency-dateformat-simpledateformat/
http://www.injavawetrust.com/pure-java-64-dates-numbers-currency-numberformat-currency-decimalformat/
Etiketler:
Calendar,
Date,
Date Format,
Number format,
Parse,
Saat,
Tarih,
Time
Kaydol:
Kayıtlar (Atom)