Yazilar:

 Sponsor Reklam 


14.09.2011 (03:31)

 Nesne Sıralama 
Sayıları, stringleri, karakterleri büyüklük ve küçüklük olarak karşılaştırıp sıralama yapabiliyoruz. Peki nesneleri birbirleriyle nasıl karşılaştıracağız ve neye göre sıralayacağız?

Öncelikle nesneleri neden sıralamak isteriz, bu ihtiyacımıza değinelim.

Daha önce nesnelerin dizi gibi saklanması ile ilgili ArrayList sınıfından şurada bahsetmiştik. Bu sınıf vasıtasıyla dinamik bir şekilde dizinin boyutuyla ilgilenmeden yeni nesneler ekleyip, nesneler çıkarabiliyoruz. Sakladığımız nesneleri sıralı bir hale getirmek ve o sırada dizinin içinde okuma yapmak isteyebiliriz. Burada karşımıza Collections sınıfının sort metodu çıkıyor. Bu metod arraylist objesi haricinde bir de Comparator nesnesi alıyor. Comparator sınıfı compare methoduna sahiptir.

Şimdi örneğimize bakalım:

Author.java:
class Author {
  private String firstName;
  private String lastName;

  public Author(){
  }
  public Author(String firstName, String lastName){
    this.firstName = firstName;
    this.lastName = lastName;
  }

  /**
    * @return Returns the firstName.
    */

  public String getFirstName() {
    return firstName;
  }
  /**
    * @param firstName The firstName to set.
    */

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  /**
    * @return Returns the lastName.
    */

  public String getLastName() {
    return lastName;
  }
  /**
    * @param lastName The lastName to set.
    */

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String toString(){
    return (this.firstName + " " + this.lastName);
  }
}

Main.java:
import java.util.*;

public class Main {

  /**
    * @param args
    */

  public static void main(String[] args) {

    Author author1 = new Author("Bekir", "Coşkun");
    Author author2  = new Author("Yılmaz", "Özdil");
    Author author3 = new Author("Emin","Çölaşan");
    Author author4 = new Author("Saygı","Öztürk");

    ArrayList authorList = new ArrayList();
    authorList.add(author1);
    authorList.add(author2);
    authorList.add(author3);
    authorList.add(author4);

    Collections.sort(authorList, new Comparator(){

        public int compare(Object o1, Object o2) {
            Author a1 = (Author) o1;
            Author a2 = (Author) o2;
            return a1.getFirstName().compareToIgnoreCase(a2.getFirstName());
        }

    });

    System.out.println(authorList);

  }
}

Imza: admin

19.09.2009 (05:05)

 Java'da Reflection Kullanımı 
Java sınıfların, metotların, metotların aldıkları değer tiplerinin isimlerini çalışma zamanında (runtime) alabilmemizi sağlamaktadır. Bunun için reflect paketi import edilir. Bu işlemlere reflection denir.

Peki java reflection ne işe yarar?
Yansıtma kütüphanesine geliştirme araçları yazarken ihtiyaç duyabiliriz. Çalışma zamanında bize string olarak gelen bir değerin sınıf olarak düşünülüp nesnesinin üretilmesi gerekebilir. İşte derleme (compile) sırasında değil de çalışma (runtime) sırasında sınıf(lar)ın nesnesinin üretilmesine, onların metotlarına, tiplerine, paketlerine erişmeye yansıtma diyoruz.

Eğer derleyici yazalım dersek girilen text kodun ayrıştırılıp (parse) yazım incelemesi (syntax) yapıldıktan sonra, kodun içinde geçen nesnelerin üretilmesi ve metotların çağrılması için böyle bir mekanizmaya ihtiyaç duyarız.

Örnek bir koda bakalım:
package kodcu.net;

import java.lang.reflect.*;

public class Main {

  public static void main(String[] args) {

    // Select a class
    class.kodcu.net/" class="linked" target="_blank">Class cls = String.class;
   
    // Get methods of the class
    Method[] methodList = cls.getDeclaredMethods();

    for (int i = 0; i < methodList.length; i++) {
      Method m = methodList[i];
      System.out.println("Method Name: " + m.getName());
     
      class.kodcu.net/" class="linked" target="_blank">Class[] parameterTypes = m.getParameterTypes();
      for (int j = 0; j < parameterTypes.length; j++) {
        System.out.println("  Parameter Type: " + parameterTypes[j].getName());
      }
     
      System.out.println();
    }
   
  }

}

Imza: admin

03.07.2009 (04:09)

 Ondalıklı Sayılarda Son Basamak 
Ondalıklı sayılarda virgülden sonraki kısıma dikkat etmek gerekmektedir. double işlemlerde burada karşılaşılabilecek hatalardan dolayı bölme ve çarpma işlemlerinde öncelik çarpmaya verilmelidir. Böylece hata payı küçülmektedir.

Şimdi ondalıklı sayılardaki önceki en büyük ondalıklı sayıya ve sonraki en küçük ondalıklı sayıya bakalım:

package kodcu.net;

import java.text.ChoiceFormat;

public class Main {

  public static void main(String[] args) {
    double d = 1.3;
   
        // Largest double before d
        double d1 = ChoiceFormat.previousDouble(d);
        System.out.println(d1);
        // Smallest double after d
        double d2 = ChoiceFormat.nextDouble(d);
        System.out.println(d2);
  }

}

Çıktı şu şekildedir:
1.2999999999999998
1.3000000000000003

Imza: admin

22.06.2009 (14:56)

 Programı Sonlandırma 
Uygulamanın herhangi bir yerinde uygulamayı sonlandırmak istersek System sınıfının exit metodunu kullanabiliriz.

package kodcu.net;

public class Main {

  public static void main(String[] args) {
    int exitCode = -1;
    // return exitCode
    System.exit(exitCode);
  }

}

Bu metot çağırısı ile o an çalışmakta olan Java Virtual Machine sonlandırılır. Sıfırdan farklı bir sayı dönerse uygulamadan, normal olmayan bir sonlanma bildirilmektedir.
Imza: admin

20.06.2009 (20:57)

 String'i Bölme, Split Etme 
split() metodu, String'leri belirli ifadelere göre parçalamayı sağlar.

Şu örnekte verilen yazıyı boşluğa göre ayrıştıralım:
package kodcu.net;

public class Main {

  public static void main(String[] args) {
    String str = "www kodcu net";
    System.out.println(str);
    String[] str2 = str.split(" ");
    for (int i = 0; i < str2.length; i++) {
      System.out.println(str2[i]);
    }
  }
}

Çıktımız şu şekilde:
www kodcu net
www
kodcu
net

Görüldüğü gibi ilk ifade boşluğa göre parçalandı.

Neye göre ayrıştırma yapılacağını bir RegEx ifadesi olarak belirtiriz.

Kaça kadar ayırştırma yapılacağını ise aynı metotta ikinci parametre olarak verebiliriz. Yazdığımız kodda şöyle bir değişiklik yaparsak:
    String[] str2 = str.split(" ",2);

Şu sonucu alırız:
www kodcu net
www
kodcu net

Görüldüğü gibi yine ilk yazı ayrıştırılmasını istediğimiz yazı. Bu yazı, boşluğa göre 2 parça olacak şekilde ayrıştırma yapılmıştır.
Imza: admin

20.05.2009 (20:49)

 Timestamp'i Formatlı Halde String'e Çevirmek 
Daha önce Timestamp sınıfı ve kullanımından bahsetmiştik. Çokça ihtiyaç duyulan tarhisel işlemlerden birisi olan tarihsel veri içeren String'in Timestamp hale dönüştürülmesinden şurada bahsetmiştik. Bunun tam tersi de yine ihtiyaç duyulan işlemlerden birisi. Şimdi Timestamp verinin belirli bir formatta istediğimiz String hale dönüştürülmesine bakalım:

package kodcu.net;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.sql.Timestamp;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) throws Exception {
   
    String pattern = "dd/MM/yyyy HH:mm";
   
    Date dt = new Date();
    Timestamp ts = new Timestamp(dt.getTime());
   
    SimpleDateFormat formatter = new SimpleDateFormat(pattern);
    String strDate = formatter.format(new Date(ts.getTime()));
   
    // This is timestamp
    System.out.println(ts);
    // This is formatted date
    System.out.println(strDate);

  }

}

Ekran çıktısı şu şekildedir:
2009-05-20 16:44:52.0
20/05/2009 16:44

Birinci veri timestamp, ikincisi ise bizim formatlı tarihimiz.
Imza: admin

17.05.2009 (21:23)

 Hex String Integer Dönüşümleri 
Hex String - Integer dönüşümlerine yerine göre ihtiyaç duyabiliriz. Bununla ilgili şu örneğe bakabilirsiniz:

package kodcu.net;

import java.awt.Color;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) throws Exception {

  String strHex = "FFFFFF";
  int intValue = Integer.parseInt(strHex, 16);
  System.out.println("This is integer value: " + intValue);
  strHex = Integer.toHexString(intValue);
  System.out.println("This is hex string: " + strHex); 
 
  Color color = new Color(intValue);
  // Color color = new Color(0xFFFFFF);
  int red = color.getRed();
  int green = color.getGreen();
  int blue = color.getBlue();
  System.out.println("RGB: " + red + " " + green + " " + blue); 
 
  }

}

Burada awt çatısı kullanılmıştır ve Color sınıfının nesnesi rengimiz oluşturulurken integer değer verilmiştir. Bu değere göre kırmızı (red), yeşil (green) ve mavi (blue) RGB değerleri elde edilmiştir.

Ekran çıktısı şu şekildedir:
This is integer value: 16777215
This is hex string: ffffff
RGB: 255 255 255

Imza: admin

15.05.2009 (21:04)

 Thread Sınıfı ve Kullanımı 
Thread'ler çok kanallı programlama (multiprogramming, multitasking) için önemli bir mekanizmadır. Java'nın da desteklediği bu sınıf aynı anda birden fazla iş yapabilmemizi ya da başka değişle farklı iş parçacıklarının aynı zamanda çalışmasını sağlamaktadır.

Thread'ler process'lerle karıştırılmamalıdır. Bir process'te birden fazla thread çalışırken ve bunların çalışmaları programlanırken (scheduling) işletim sistemine göre aynı anda birden fazla process çalışmayabilir (multiprocessing). Bu o işletim sisteminin yeteneği ile ve CPU (işlemci) sayısının birden fazla olması ile ilgilidir.

Şimdi bu sınıfın kullanımına bakalım. Kendi thread sınıflarımızı oluşturmak için sınıf oluşturduktan sonra Thread sınıfını genişletiriz (extend). Yapcağımız işlemleri kendi sınıfımızda run() metodu oluşturarak içinde yaparız. Bu kanal çalıştırılacağı zaman start() metodu çağırılır.

Şu örneğe bakalım:

Main.java:
package kodcu.net;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) {

    ThreadDemo td1 = new ThreadDemo(1);
    ThreadDemo td2 = new ThreadDemo(2);
    ThreadDemo td3 = new ThreadDemo(3);
   
    td1.start();
    td2.start();
    td3.start();
   
  }

}

ThreadDemo.java:
package kodcu.net;

public class ThreadDemo extends Thread {
  private int id;
  public ThreadDemo(int id) {
    this.id = id;
  }

  public void run() {
   
    for (int i = 0; i < 10; i++) {
      System.out.println("Thread ID: " + id + " Number: " + i);
    }

  }
}

Ekran çıktısı şu şekildedir:
Thread ID: 2 Number: 0
Thread ID: 2 Number: 1
Thread ID: 2 Number: 2
Thread ID: 2 Number: 3
Thread ID: 2 Number: 4
Thread ID: 2 Number: 5
Thread ID: 2 Number: 6
Thread ID: 2 Number: 7
Thread ID: 2 Number: 8
Thread ID: 2 Number: 9
Thread ID: 1 Number: 0
Thread ID: 1 Number: 1
Thread ID: 1 Number: 2
Thread ID: 3 Number: 0
Thread ID: 1 Number: 3
Thread ID: 3 Number: 1
Thread ID: 1 Number: 4
Thread ID: 3 Number: 2
Thread ID: 1 Number: 5
Thread ID: 3 Number: 3
Thread ID: 1 Number: 6
Thread ID: 3 Number: 4
Thread ID: 1 Number: 7
Thread ID: 1 Number: 8
Thread ID: 1 Number: 9
Thread ID: 3 Number: 5
Thread ID: 3 Number: 6
Thread ID: 3 Number: 7
Thread ID: 3 Number: 8
Thread ID: 3 Number: 9

Görüldüğü gibi kanal kendi içerisinde sıralı çalışırken hangi kanalın önce davranacağı konusu belirli değildir. Kanalların aynı anda çalışma mantığı bunu gerektirir. Önemli olan verilen zaman içerisinde bu kanalların birlikte koşmasıdır (run).

Bir kanalın ayakta olup olmadığını isAlive() metodu ile öğrenmekteyiz. Kanalın uyumasını sleep(long) metodu ile sağlarız. Kanal içerisinde de Thread.sleep(long) metodu ile sağlayabiliriz.

Kanalı oluşturup istediğimiz zaman çalışmasını istersek şöyle bir yol izleyebiliriz. Burada kanala yapılan metod çağrılarında sıralı işlem yapılması için synchronized anahtar kelimesini (keyword) kullanacağız.

    public synchronized void run() {
        while (true) {
            try {
                wait();
            } catch (InterruptedException ie) {
                // ie
                //System.out.println("InterruptedException");
            }
            connect();
        }
    }
   
    public synchronized void go() {
        notify();
    }

    private void connect() {
        // işlemler
    }

Burada da wait() metodu ve notify() metodunu görüyoruz. Bu metotlar Object sınıfının metotlarıdır ve kanalı wait() ile beklemeye alırız notify() ile uyandırırız.

Kanalların çalışma anları için öncelik verebiliriz. Bunu da Thread sınıfının setPriority(int) metodu ile sağlarız. Öncelik değerleri 0-10 arasındadır ve bunla ilgili tanımlı bazı sabitler şunlar:
Thread.MIN_PRIORITY =1
Thread.NORM_PRIORITY =5
Thread.MAX_PRIORITY=10

Çok fazla kanalla çalışırken boşta duran kanalın işgalini önlemek için yield() metodunu kullanmaktayız. Bekleme sırasında yüksek veya eşit önceliğe sahip kanalların çalışmasına izin verir.

join() metodu, kanalın belirli süre veya ölene kadar beklemesini sağlar.

interrupt() metodu wait halindeki veya sleep halinde de olabilen kanalın uyandırılmasını (kesme işlemini) sağlamaktadır. Kanalın kesme durumunda olup olmadığı da isInterrupted() metodu ile öğrenilmektedir.

Kanalı öldürmek için stop() veya destroy() metotları kullanılmaktadır.
Imza: admin

06.05.2009 (02:32)

 Properties Sınıfı ve Kullanımı 
Properties sınıfı java.util çatısı altında yer alan bir sınıftır. Belirli anahtarlara (keys) karşılık belirli değerlerin (values) eşleşmesini sağlamaktadır. Bu eşleşme daha önce şu yazıda bahsettiğimiz Hashtable sınıfındaki anahtar-değer (key-value) eşleşmesine benzemektedir.

Peki Hashtable ile Properties sınıflarının farkı nedir?

Hashtable'da anahtar ve değer çiftimiz Object tipinde iken Properties sınıfında anahtar ve değer çiftimiz String tipindedir. Örnek olarak Hashtable'da bir string değerine karşılık bir nesne ekleyebiliyorken Properties'te string'e karşılık sadece string tutabiliyoruz.

Bundan anlaşıldığı gibi Properties sınıfı daha özel bir sınıftır ve Hashtable'ı bu amaçla genişletir (extend).

Properties kullanımına yönelik şu örneğe bakalım:

package kodcu.net;

import java.util.Properties;

public class Main {

  // Constructor
  public Main() {}

  public static void main(String[] args) {
    Properties dbFieldProp = new Properties();
    dbFieldProp.put("id", "USER_ID");
    dbFieldProp.put("username", "USER_NAME");
    dbFieldProp.put("password", "USER_PASSWORD");
    dbFieldProp.put("email", "USER_EMAIL");

    System.out.println(dbFieldProp.getProperty("email"));
  }

}

Programın çıktısı şu şekildedir:
USER_EMAIL

getProperty() metodu ile değer okuması yapılmaktadır.

Örnekte veritabanı alanları değerler olarak düşünülmüştür ve bunlara erişmede kullanılacak kelimeler de anahtar kelimelerdir.
Imza: admin

30.04.2009 (21:39)

 Dosyadan Tamponlu Okuma Yapma 
Karakter karakter veya satır satır okuma ile ilgili daha önce burada ve şurada değinmiştik.

Bunların dışında tamponlu yani buffer kullanarak okuma nasıl yapılır ona bakalım.

Tamponlu okumada bir byte dizimiz mevcuttur ve her okuma anında bu byte dizisi kadar veri okunur.

Örnek:
package kodcu.net;

import java.io.*;

public class Main {

  public static final int BUFFER_SIZE = 20;

  public static void main(String[] args) {

    try {
      File file = new File("C://kodcu.txt");
      FileInputStream fis = new FileInputStream(file);
      int c;

      byte[] dizi = new byte[BUFFER_SIZE];
      int len = 0;
      while ((len = fis.read(dizi, 0, BUFFER_SIZE)) == BUFFER_SIZE) {
        System.out.print(new String(dizi));
      }
      if (len != -1) {
        byte[] kalan = new byte[len];
        for (int i = 0; i < len; i++) {
          kalan[i] = dizi[i]; // last part
        }
        System.out.print(new String(kalan));
      }

      fis.close();
    }
    catch (FileNotFoundException fnfe) { }
    catch (IOException ioe) { }
  }

}

Imza: admin

 1   2  ··  9 





Yazilar kaynak gosterilmeden kopyalanamaz © www.kodcu.net // Twitter