<< index           < bölüm 10                 > bölüm 12                



      BÖLÜM 11 GELİŞMİŞ JAVA BİLGİ İŞLEME YAPILARI

 

11.0 GİRİŞ

Bu bölümde çeşitli ileri bilgi işleme ve boyut oluşturma kavramlarına göz atacağız.

  

11.1 STRINGTOKENIZER SINIFI

 

Biz bir cümle okuduğumuzda beynimiz cümleyi otomatik olarak kelimelerine ayırır. Java Dilinde bu görevi StringTokenizer sınıfı yerine getirir. StringTokenizer sınıfının yapısı :

 

Public class StringTokenizer implements Enumeration {

    private int currentPosition;

    private int maxPosition;

    private String str;

    private String delimiters;

    private boolean retTokens;

    public StringTokenizer(String str, String delim, boolean returnTokens)

    public StringTokenizer(String str, String delim)

    public StringTokenizer(String str)

    private void skipDelimiters()

    public boolean hasMoreTokens()

    public String nextToken()

    public String nextToken(String delim)

    public boolean hasMoreElements()

    public Object nextElement()

    public int countTokens()

}

 

StringTokenizer sıfını açıklamak için önce küçük bir program verelim :

  Program 11.1 : StringTokenizerTest.java programı

 

import java.io.*;
import java.util.*;

public class StringTokenizerTest
{
  public static void main(String arg[])
  {
  String s="Ali veli 49 elli";
  System.out.println("cumle : "+s);
  StringTokenizer t=new StringTokenizer(s);
  System.out.println("kelime sayisi : "+t.countTokens()
);
  int i=0;
  while(t.hasMoreTokens())
  {
  System.out.println("kelime indeksi : "+(i++)+" kelime : "+t.nextToken()
);
  }
  }
}

 

Programdan da görüleceği gibi StringTokenizer sınıfı

 

StringTokenizer t=new StringTokenizer(s);

deyimiyle tanımlanmıştır. Ayrica stringin içindeki cümle sayısı t.countTokens(); metotuyla çağırılmış, t.hasMoreTokens() sınıfı ise daha fazla kelime kalıp kalmadığının boolean kontrolu metotu olarak çağırılmıştır. t.nextToken() metotu o andaki kelimeyi dışarıya (String cinsinden) aktarırken indeksi de (currentPosition) bir sonraki kelimeye kaydırır.

 

Program çıktısı :
 

cumle : Ali veli 49 elli
kelime sayisi : 4
kelime indeksi : 0 kelime : Ali
kelime indeksi : 1 kelime : veli
kelime indeksi : 2 kelime : 49
kelime indeksi : 3 kelime : elli

olacaktır.

 

StringTokenizer sınıfının kullanılmasıyla ilgili bir örnek daha verelim. Bu örnekte ninci dereceden bir polinomun kokleri Matrix.java kütüphanesi (detaylar için bakınız bölüm 12) kullanılarak çözülür. girdi alanında tüm polinom katsayıları bir alan içinde tanımlanmakta ve sonra bu bileşik alandan StringTokenizer sınıfı yardımı ile katsayılar tek tek çekilmektedir.



Program 11.2 kokN.java progamı, n'inci dereceden polinomun köklerini hesaplar. Tek bir string olarak girilen katsayılar matrisinden katsayıları StringTokenizer sınıfını kullanarak çeker.

 

import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
import Matrix;

public class kokN extends Applet implements ActionListener
{
    private Label prompt1,prompt2;
    private TextField input;
    TextArea t;
    Panel YaziPaneli;
    int n;
    String s;

    public void init()
    {
        setBackground(Color.lightGray); 
        YaziPaneli=new Panel();
        YaziPaneli.setFont(new Font("Serif",Font.BOLD,12));
        YaziPaneli.setLayout( new GridLayout(3,1) );
        t=new TextArea(8,47);
        prompt1= new Label("a[0]+a[1]*x+...+a[n]*x^n=0");
        prompt2= new Label("n inci dereceden polinomun katsayilarini giriniz : ");
        input = new TextField(30);
        YaziPaneli.add(prompt1);
        YaziPaneli.add(prompt2);
        YaziPaneli.add(input);
        add(YaziPaneli);
        add(t);
        input.addActionListener(this); 
    }

    public void  actionPerformed(ActionEvent e)
    {
            s=input.getText();
            StringTokenizer token=new StringTokenizer(s);
            t.setText("");
            n=token.countTokens()-1;
            int m=n+1;
            double a[]=new double[m];
            complex z[]=new complex[n];
            for(int i=0;i<n;i++)
            {
            z[i]=new complex();
            } 
            int j=0; 
                 while(token.hasMoreTokens())
                 {
                 Double ax=new Double(token.nextToken());
                 a[j++]=ax.doubleValue();
                 }
                 z=Matrix.poly_rootsC(a);
                 int i=0;
                 t.setText(Matrix.toStringT(z));
                 input.setText("");
    }
}

 

11001.JPG


Şekil 11.1 StringTokenizer sınıfını ve matrix sınıfını kullanarak  ninci dereceden bir polinomun koklerini hesaplayan kokN.java programının  applet çıktısı

 

Aynı programın swinf JFrame versiyonu :

 

Program 11.3 kokNSWF_2000.java progamı, n'inci dereceden polinomun köklerini hesaplar. Tek bir string olarak girilen katsayılar matrisinden katsayıları StringTokenizer sınıfını kullanarak çeker.

 

import java.util.*;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

import Matrix;

 

public class kokNSWF_2000 extends JFrame implements ActionListener

{

    private JLabel prompt1,prompt2;

    private JTextField input;

    JTextArea t;

    JPanel YaziPaneli;

    int n;

    String s;

    Container c;

    public kokNSWF_2000()

    {

        super("n inci dereceden polinomun kökleri");

        c=getContentPane();

        c.setLayout(new FlowLayout());

        YaziPaneli=new JPanel();

        YaziPaneli.setFont(new Font("Serif",Font.BOLD,12));

        YaziPaneli.setLayout( new GridLayout(3,1) );

        t=new JTextArea();

        t.setBackground(c.getBackground());

        prompt1= new JLabel("a[0]+a[1]*x+...+a[n]*x^n=0");

        prompt2= new JLabel("n'inci dereceden polinomun katsayılarını giriniz : ");

        input = new JTextField(30);

        input.setBackground(c.getBackground());

        YaziPaneli.add(prompt1);

        YaziPaneli.add(prompt2);

        YaziPaneli.add(input);

        c.add(YaziPaneli);

        c.add(t);

        input.addActionListener(this);

    }

 

    public void  actionPerformed(ActionEvent e)

    {

            s=input.getText();

            StringTokenizer token=new StringTokenizer(s);

            t.setText("");

            n=token.countTokens()-1;

            int m=n+1;

            double a[]=new double[m];

            complex z[]=new complex[n];

            for(int i=0;i<n;i++)

            {

            z[i]=new complex();

            }

            int j=0;

                 while(token.hasMoreTokens())

                 {

                 Double ax=new Double(token.nextToken());

                 a[j++]=ax.doubleValue();

                 }

                 z=Matrix.poly_rootsC(a);

                 int i=0;

                 t.setText(Matrix.toStringT(z));

                 input.setText("");

    }

 

      public static void main(String[] args)

      {

      kokNSWF_2000 pencere= new kokNSWF_2000();

      pencere.addWindowListener(new BasicWindowMonitor());

      pencere.setSize(350,300);

      pencere.setVisible(true);

      }

 

}

11002.JPG

Şekil 11.2 StringTokenizer sınıfını ve matrix sınıfını kullanarak  ninci dereceden bir polinomun koklerini hesaplayan kokNSWF_2000.java programının  JFrame çıktısı

 

StringTokenizer sınıfının alt değişkenleri :
  nval : eğer seçilmiş olan token bir sayı ise nval bu sayının değerini içerir.
  sval
     eğer seçilmiş olan token bir kelime(String) ise sval bu String değişkenini içerir
  TT_EOF
     girdi stringinin sonuna ulaşıldığını gösterir
  TT_EOL
     satır sonu okunduğunu bildirir
  TT_NUMBER
     bir sayi tokeni okunduğunu bildirir
  TT_WORD
     bir kelime(String) token'i okunduğunu bildirir..
  ttype
     nextToken metotu çağrıldıkrtan sonra bu değişken en son okunan token (kelimenin) türünü bildiri

  StringTokenizer sınıfının  metotları :
  kurucu metot :
  StreamTokenizer(Reader)
  eolIsSignificant(boolean)
    satır sonu kumutunun yeni kelime tanımlayıp tanımlamadığını belirler.
  lineno()
     satır sayısını verir.
  lowerCaseMode(boolean)
    kelimelerin otomatik olarak küçük harfe çevrilip çevrilmeyeceğini tanımlar
  nextToken()
 
    giriş Stringinin içindeki bir sonraki kelimeyi bulur.
  ordinaryChar(int)
     Tokanizer'in normalde kontrol için kullandığı coşluk,satır sonu gibi özel kontrol karakterlerinin normal karakter olarak okunmasını sağlar
  parseNumbers()
     Direk olarak bir sayı dizininin geldiğini haber verir
  pushBack()
   bir sonraki nextToken çağırılmasında kelimenin şu andaki kelime olarak kalmasını sağlar.
  quoteChar(int)
     eğer " karecteri varsa bunun içindeki karakterleri bir String değişkeni olarak algılar.
  slashSlashComments(boolean)
     Tokenizer'in C++-tipi (//.....)comment  deyimlerini comment olarak tanıyım tanımıyacağını belirler.
  slashStarComments(boolean)
     Tokenizer'in C-tipi comment (/*...*/)  deyimlerini comment olarak tanıyıp tanımıyacağını belirler.
  toString()
    o anda seçilmiş olan klimeyi (token) gönderir.
  whitespaceChars(int, int)
     birinciinteger <= c <= ikinciinteger arasındaki karekterleri boşluk olarak tanımlar
  wordChars(int, int)
      birinciinteger <= c <= ikinciinteger arasındaki karekterleri tek kelime olarak tanımlar

 

  11.2 STRİNG BUFFER SINIFI

 

Yeri gelmişken String sınıfının kardeş sınıfı, StringBuffer sınıfından da bahsedelim. StringBuffer genel olarak String sınıfının aynıdır, fakat genellikle dinamik olarak program içinde değeri sıkça değişen Stringler için kullanılır. String ise genellikle statik olarak verilen String değişkenleri içindir. StringBuffer sınıfına Append metotuyla dinamik olarak ilave yapabiliriz.

StringBuffer sınıfının metod yapısı şöyledir :

 

package java.lang;

public final class StringBuffer implements java.io.Serializable {

    private int count;

    private boolean shared;

    static final long serialVersionUID = 3388685877147921107L;

    public StringBuffer

    public StringBuffer(int length)

    public StringBuffer(String str)

    public int length()

    public int capacity()

    private final void copy()

    public synchronized void ensureCapacity(int minimumCapacity)

    private void expandCapacity(int minimumCapacity)

    public synchronized void setLength(int newLength)

      public synchronized char charAt(int index)

    public synchronized void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)

    public synchronized void setCharAt(int index, char ch)

    public synchronized StringBuffer append(Object obj)

    public synchronized StringBuffer append(String str)

    public synchronized StringBuffer append(char str[])

    public synchronized StringBuffer append(char str[], int offset, int len)

    public StringBuffer append(boolean b)

    public synchronized StringBuffer append(char c) String)

    public StringBuffer append(int i)

    public StringBuffer append(long l)

    public StringBuffer append(float f)

    public StringBuffer append(double d)

    public synchronized StringBuffer delete(int start, int end)

    public synchronized StringBuffer deleteCharAt(int index)

    public synchronized StringBuffer replace(int start, int end, String str)

    public String substring(int start)

    public synchronized String substring(int start, int end)

    public synchronized StringBuffer insert(int index, char str[], int offset, int len)                                                                    

    public synchronized StringBuffer insert(int offset, Object obj)

    public synchronized StringBuffer insert(int offset, char str[])

    public StringBuffer insert(int offset, boolean b)

    public synchronized StringBuffer insert(int offset, char c)

    public StringBuffer insert(int offset, int i)

    public StringBuffer insert(int offset, long l)

    public StringBuffer insert(int offset, float f)

    public StringBuffer insert(int offset, double d)

    public synchronized StringBuffer reverse()

    public String toString

    private void readObject(java.io.ObjectInputStream s)

         throws java.io.IOException, ClassNotFoundException

}  

 

Şimdi küçük bir test programında StringBuffer sınıfını kullanalım :

 

Program 11.4 TestString.java, giren String değişkenini tersine çevirir.

 

class TersString {
              public static String reverseIt(String source) {
                  int i, len = source.length();
                  StringBuffer dest = new StringBuffer(len);

                  for (i = (len - 1); i = 0; i--) {
                      dest.append
(source.charAt(i));
                  }
                  return dest.toString();
              }
          }

 

diğer bir StringBuffer metotu insert metotudur. Bu metot i inci elementten sonra verilen yeni parçayı ilave edecektir.

Program 11.5 javaKahvesi.java,  StringBuffer, insert metodu örneği

 

import java.io.*;

class javaKahvesi {
     public static void main (String args[])
     {
     StringBuffer sb = new StringBuffer("Java kahvesi ic!");
               sb.insert(12, "ni sicak");
               System.out.println(sb.toString());
     }
}

 

bu programı çalıştırdığımızda
              Java kahvesini sicak iç!
mesajını verecektir.

 

11.3 VECTOR SINIFI

 

Daha önce boyutlu değişkenleri görmüştük. Boyutlu değişkenlerin boyutları bilgisayar belleğinde oluşturulurken birbiri ardına sırayla oluşturulur.

Örneğin double b[]=new double[3];

Deyimi bilgisayar belleğinde

Tablo 11.1 boyutlu değişkenlerin bilgisayar belleğinde yerleşimi

 

1023400

b[0]

1023464

b[1]

1023528

b[2]

 

yerlerini birbirini izleyen adreslerde ayırır.

 

Buradaki sorun eğer bilgisayar belleğindeki toplam yer değiştirilmek istenirse bunun zor olmasıdır. Aynı zamanda bilgisayar boyutlu değişkenin adreslerini bilgisayar hafızasında bir referans tablosu olarak tuttuğundan boyut değiştirme bilgisayar hafızasını da zorlayan bir işlemdir. Pratik olarak yapılan uygulama yeni bir boyutlu değişken oluşturup adresleri değiştirmektir.

 

double c[]=new double[5];
for(int i=0,i<b.length;i++)
{ c[i]=b[i];}
b=c;

 

Daha gelişmiş bir bilgi yapısı olarak Vector sınıfını kullanabiliriz. Vector sınıfı java.util  kütüphanesinde tanımlanmıştır. Vector sınıfında her bilgi elemanı aynı zamanda bir sonraki bilgi elemanının adresini taşır. Boylece istenildiğinde dizinin son elemanına yeni bir adres ilave edilerek kolayca yeni elemanlar ilave edilebilir.

 

11003.JPG

Şekil 11.3 Vectör sınıfının hafızada yerleşimi

 

Dizinin arasından herhangibir elemanı da kalaylıkla sadece referans adresini değiştirerek silebiliriz.

Vector sınıfının tanımı :

 

public class Vector extends AbstractList implements List, Cloneable,

                                                                                            java.io.Serializable {

    protected int elementCount;

    protected int capacityIncrement;

    private static final long serialVersionUID = -2767605614048989439L;

    public Vector(int initialCapacity, int capacityIncrement);

    public Vector(int initialCapacity);

    public Vector();

    public Vector(Collection c);

    public synchronized void copyInto(Object anArray[]);

    public synchronized void trimToSize();

    public synchronized void ensureCapacity(int minCapacity);

    private void ensureCapacityHelper(int minCapacity);

    public synchronized void setSize(int newSize);

    public int capacity();

    public boolean isEmpty();

    public Enumeration elements();

    public boolean hasMoreElements();

    public Object nextElement();

    public boolean contains(Object elem);

    public int indexOf(Object elem);

    public synchronized int indexOf(Object elem, int index);

    public int lastIndexOf(Object elem);

    public synchronized int lastIndexOf(Object elem, int index)

    public synchronized Object elementAt(int index);

    public synchronized Object firstElement();

    public synchronized Object lastElement();

    public synchronized void setElementAt(Object obj, int index);

    public synchronized void removeElementAt(int index);

    public synchronized void insertElementAt(Object obj, int index);

    public synchronized void addElement(Object obj) ;

    public synchronized boolean removeElement(Object obj);

    public synchronized void removeAllElements();

    public synchronized Object clone();

    public synchronized Object[] toArray();

    public synchronized Object[] toArray(Object a[]);

    public boolean remove(Object o);

    public void add(int index, Object element);

    public synchronized Object remove(int index);

    public void clear();

    public synchronized boolean containsAll(Collection c);

    public synchronized boolean addAll(Collection c);

    public synchronized boolean removeAll(Collection c);

    public synchronized boolean retainAll(Collection c); 

    public synchronized boolean addAll(int index, Collection c);

    public synchronized boolean equals(Object o);

    public synchronized int hashCode();

    public synchronized String toString();

    public List subList(int fromIndex, int toIndex);

    protected void removeRange(int fromIndex, int toIndex);

}

 

Vector sınıfında tanımlanan metotların bazılarının anlamları şunlardır :

addElement(Object)  
Vektöre object türü (herhangi bir sınıf olabilir, vectörün hepsi bu sınfta tanımlanmış olmalıdır.) bir eleman ekler.
capacity()
 
vektörün toplam kapasitesini verir.
clone()
 
vectorun bir kopye vectörünü verir.
contains(Object)
 
Vectörün içinde sorgulanan elemanın olup olmadığını kontrol eder.
copyInto(Object[])
 
vectorü boyutlu değişkene aktarır.
elementAt(int indeks)
 
Verilen indeksteki elemanı verir..
elements()
 
Tüm vektörü enumeration sınıfına aktarır.
ensureCapacity(int yeni_kapasite)
 
eğer yeni_kapasite vector kapasitesinin üstündeyse vector yeni_kapasite’ye aktarılır.
firstElement()
 
Vectörün ilk elemanını verir.
indexOf(Object)
 
Object’in indeks değerini verir
indexOf(Object, int indeks)
 
Object’in indeks değerini verir, arama indeks değişkeninden başlayarak yapılır.
insertElementAt(Object, int indeks)
 
Vectörün ideks noktasına Object ilave edilir.
isEmpty()
 
Vectörün boş olup olmadığı kontrol edilir.
lastElement()
 
vectörün son elemanının indeksini verir.
lastIndexOf(Object)
 
Object’in vectördeki son tekrarının indeksini verir.
lastIndexOf(Object, int indeks)
 
indeks ten başlayarak geriye doğru Objectin ilk tekrarlandığı yeri bulur.
removeAllElements()
 
Vectördeki bütün elemanları siler.
removeElement(Object)
 
Vectördeki Object elemanını siler.
removeElementAt(int indeks)
 
indeksle verilen elemanı siler.
setElementAt(Object, int indeks)
 
Objectin ideksini indeks olarak belirler.
setSize(int)
 
Sets the size of this vector.
size()
 
Vectördeki toplam eleman sayısını verir.
toString()
 
Vectörün String eşitini verir.
trimToSize()
 
Vectörün boyutunu dolu olan elemanlarının boyutuna kısaltır.

 

Aşağıda bu metotların önemlilerinden bazılarını kullanan  bir örnek program verilmiştir.

 

Program 11.6 : VectorTesti.java programı, vector sınıfının kullanımı

 

import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

public class VectorTesti extends Applet implements ActionListener
{
    private Vector v;
    private Label prompt;
    private TextField input;
    private Button addBtn, removeBtn, firstBtn, lastBtn, emptyBtn, containsBtn, locationBtn, trimBtn,
           statsBtn, displayBtn;
    Panel YaziPaneli;

    public void init()
    {
        setBackground(Color.lightGray); 
        YaziPaneli=new Panel();
        YaziPaneli.setFont(new Font("Serif",Font.BOLD,12));
        YaziPaneli.setLayout( new GridLayout(5,2) );
        v = new Vector(1);
        prompt= new Label("Bir String degiskeni giriniz ");
        input = new TextField(10);
        addBtn = new Button("Ekle");
        removeBtn = new Button("Cikar");
        firstBtn = new Button("Ilk");
        lastBtn = new Button("Son");
        emptyBtn = new Button("Bos mu ?");
        containsBtn = new Button("Listede varmi?");
        locationBtn = new Button("Adresi");
        trimBtn = new Button("Kes");
        statsBtn = new Button("Istatistikler");
        displayBtn = new Button("Listeyi Goster");
        add(prompt);
        add(input);
        addBtn.addActionListener(this);
        YaziPaneli.add(addBtn);
        removeBtn.addActionListener(this);
        YaziPaneli.add(removeBtn);
        firstBtn.addActionListener(this);
        YaziPaneli.add(firstBtn);
        lastBtn.addActionListener(this);
        YaziPaneli.add(lastBtn);
        emptyBtn.addActionListener(this);
        YaziPaneli.add(emptyBtn);
        containsBtn.addActionListener(this);
        YaziPaneli.add(containsBtn);
        locationBtn.addActionListener(this);
        YaziPaneli.add(locationBtn);
        trimBtn.addActionListener(this);
        YaziPaneli.add(trimBtn);
        statsBtn.addActionListener(this);
        YaziPaneli.add(statsBtn);
        displayBtn.addActionListener(this);
        YaziPaneli.add(displayBtn);
        add(YaziPaneli);
    }

    public void  actionPerformed(ActionEvent e)
    {
        if(e.getSource()==addBtn)
        {
            v.addElement(input.getText());
            showStatus("Listenin sonuna eklendi: "+input.getText());
        }
        else if(e.getSource()==removeBtn)
        {
            if(v.removeElement(input.getText()))
                showStatus("Silindi :"+input.getText());
              else
                showStatus(input.getText()+"not in vector");
        }
        else if(e.getSource() == firstBtn)
        {
            try{
                showStatus("Ilk eleman : "+v.firstElement());
            }
            catch(NoSuchElementException exception)
            {
                showStatus(exception.toString() );
            }
        }
        else if(e.getSource()==lastBtn)
        {
            try{
                showStatus("Son eleman : "+v.lastElement());
            }
            catch(NoSuchElementException exception)
            {
                showStatus(exception.toString() );
            }
        }
        else if(e.getSource() == emptyBtn)
        {
            showStatus(v.isEmpty()? "Vector bos ":"vector dolu ");
        }
        else if(e.getSource()==containsBtn)
        {
            String searchKey = input.getText();

            if(v.contains(searchKey) )
               showStatus("Vektor elemanlar� " +searchKey);
            else
               showStatus("Aranan eleman Vektorde bulunamadi "+searchKey);
        }
        else if(e.getSource()==locationBtn)
        {
            showStatus("Eleman "+v.indexOf(input.getText() )+" pozisyonunda bulundu");
        }
        else if(e.getSource()==trimBtn)
        {
            v.trimToSize();
            showStatus("Vector boyu eleman boyuna k�salt�ld�");
        }
        else if(e.getSource()== statsBtn)
        {
            showStatus("Boyut = "+v.size()+"; Toplam kapasite = "+v.capacity());
        }
        else if(e.getSource()== displayBtn)
        {
            Enumeration enum=v.elements();
            StringBuffer buf = new StringBuffer();
            while(enum.hasMoreElements())
                 {
                 buf.append(enum.nextElement() );
                 buf.append(" ");
                 }
            showStatus(buf.toString() );
        }
        input.setText("");
    }
}

11004.JPG

 

 

 

1105.JPG

Şekil 11.4-11.5 VectorTesti.java programı applet çıktısı

 

Bundan sonraki program iki kümenin bileşim ve kesişim kümelerini hesaplamaktadır. Kümelerin kaç elemandan oluştuğu tanımlanmamıştır. İşlemler vector sınıfını kullanarak yapılmaktadır. Ayrıca bu yapıda vector sınıfını bir döngü içinde kullanmak için vector sınıfı Enumeration sınıfı na yüklenmektedir. Enumeration sınıfının görevi, StringTokenizer sınıfının görevini andırır. Vector yapısının içinden her vector elemanını ayrı ayrı çağırma ve indeksleme görevi görür. Enumeration interface’inin tanımı :

 

public interface Enumeration {

    boolean hasMoreElements();

    Object nextElement();

}

 

şeklindedir. 

 

Enumeration n1=list1.elements();
Enumeration n2=list2.elements();
while(n1.hasMoreElements())
{
s1=(String)n1.nextElement();
bilesimVectoru.addElement(s1);
}

 

kod parçacığında vector sınıfının elements metotu,Enumeration sınıfı ve Enumeration sınıfının hasMoreElements  ve nextElement  metotları kullanılarak nasıl döngü oluşturulduğu görülmektedir.

Aşağıdaki örnekte setA sınıfı verilmiştir. Bu örnekte bir kümelerin bileşim ve kesişim kümelerinin vector metodunu kullanarak nasıl oluşturulabileceği gösterilmektedir.

  

Program 11.7 setA.java setTest.java sınıfları, bir kümenin bileşim ve kesişim kümelerini hesaplar.

// Bu program vector ve Enumeration siniflarını
// Kullanmaktadır. Bilesim, kesisim kümelerini hesaplar
// Ayni zamanda StringTokaniser sinifini kullanir.

import java.util.*;
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;

class SetA
{
    public Vector bilesim(Vector list1, Vector list2)
    {
        Vector bilesimVectoru = new Vector();
        String s1,s2;
        Enumeration n1=list1.elements();
        Enumeration n2=list2.elements();
        while(n1.hasMoreElements())
        {
            s1=(String)n1.nextElement();
            bilesimVectoru.addElement(s1);
        }
        while(n2.hasMoreElements())
        {
            s2=(String)n2.nextElement();
            if(!bilesimVectoru.contains(s2))
                bilesimVectoru.addElement(s2);
        }
        return bilesimVectoru;
    }

    public Vector kesisim(Vector list1,Vector list2)
    {
        Vector kesisimVectoru = new Vector();
        String s;
        Enumeration n = list1.elements();
        while(n.hasMoreElements())
        {
            s=(String)n.nextElement();
            if(list2.contains(s))
                kesisimVectoru.addElement(s);
        }
        return kesisimVectoru;
    }
}

 

public class  SetTest extends Applet implements ActionListener
{
    SetA    set = new SetA();   // SetA
    Label L1, P1, P2;
    TextField T1,T2;
    TextArea cikti; 

//  dinamik boyutlu degisken sinifi Vector'u kullanarak
//  iki vector listesi yarat
    Vector list1 = new Vector();
    Vector list2 = new Vector();

//  Sonuclari yine vektor cinsinden degiskenler
//  kullanarak aktar
    Vector ansUn;
    Vector ansInt;

    public void init() {
        P1 = new Label("Birinci listeyi gir : ");
        T1 = new TextField(50);
        P2 = new Label("Ikinci  listeyi gir : ");
        T2 = new TextField(50);

// Sonuclarin yazildigi yazi alanini ac
        cikti = new TextArea(10,40);
        cikti.setEditable(false);
        cikti.setText("");
        add(P1);
        add(T1);
        T1.addActionListener(this);
        add(P2);
        add(T2);
        T2.addActionListener(this);
        add(cikti);
    }

    public void girdiA(String string, Vector list)
    {
        // StringTokeniser sinifi String degiskenleri icin
        // Enumeration sinifinin yaptigina paralel gorev
        // gorur String'i siraya sokarak degerlerini sirayla verir
        StringTokenizer tokens = new StringTokenizer(string);
        while(tokens.hasMoreTokens()) {
            String test = tokens.nextToken();
            list.addElement(test);
        }
    }

    public void ciktiA(Vector v)
    {
        Enumeration enum = v.elements();
        while(enum.hasMoreElements())
        {
            String ans = (String)enum.nextElement();
            cikti.append(ans + "\n");
        }
    }

    public void actionPerformed(ActionEvent e)
    {
         if(e.getSource()==T1)
         {
            String stringToTokenize = T1.getText();
            girdiA(stringToTokenize,list1);
         }
        else if(e.getSource()==T2)
        {
            String stringToTokenize = T2.getText();
            girdiA(stringToTokenize,list2);
//          Iki listenin bilesim ve kesisim k�melerini hesapla.
            ansUn = set.bilesim(list1,list2);
            ansInt = set.kesisim(list1,list2);
//          sonuclari cikti alanina gonder
            cikti.append("\nIki listenin bilesim kumesi : \n");
            ciktiA(ansUn);
            cikti.append("\nIki listenin kesisim kumesi : \n");
            ciktiA(ansInt);
        }
    } //actionPerformed metotunun sonu
}
 

Bu programda aynı zamanda StringTokaniser sınıfı kullanılmıştır. StringTokaniser String değişkenini bosluk kullanarak alt değişkenlere ayırmaya yarayan Enumeration türü bir sınıftır.

 

11006.JPG


Şekil 11.6 Vector sınıfını kullanarak iki kumenin bileşim ve kesişim kümelerini hesaplayan SetTest.java programı  applet çıktısı

 

Aynı programın Swing versiyonuSetTestSWF_2000.java aşağıda verilmiştir :

 

// Bu program vector ve Enumeration siniflarını

// Kullanmaktadır. Bileşim ve kesişim kümelerini hesaplar

// Aynı zamanda StringTokeniser sınıfını kullanır.

 

Program 11.8 setTestSWF_2000.java, bir kümenin bileşim ve kesişim kümelerini hesaplar.

 

import java.util.*;

import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

 

public class  SetTestSWF_2000 extends JFrame implements ActionListener

{

    SetA    set = new SetA();   // SetA

    JLabel L1, P1, P2;

    JTextField T1,T2;

    JTextArea cikti;

 

//  dinamik boyutlu degisken sinifi Vector'u kullanarak

//  iki vector listesi yarat

    Vector list1 = new Vector();

    Vector list2 = new Vector();

 

//  Sonuclari yine vektor cinsinden de§iskenler

//  kullanarak aktar

    Vector ansUn;

    Vector ansInt;

    Container c;

 

    public SetTestSWF_2000()

    {

        super("küme testi bileşim ve kesişim kümeleri");

        c=getContentPane();

        c.setLayout(new FlowLayout());

        P1 = new JLabel("Birinci listeyi giriniz : ");

        T1 = new JTextField(30);

        T1.setBackground(c.getBackground());

        P2 = new JLabel("İkinci  listeyi giriniz : ");

        T2 = new JTextField(30);

        T2.setBackground(c.getBackground());

 

        // Sonuclarin yazildigi yazi alanini ac

        cikti = new JTextArea();

        cikti.setEditable(false);

        cikti.setText("");

        cikti.setBackground(c.getBackground());

        c.add(P1);

        c.add(T1);

        T1.addActionListener(this);

        c.add(P2);

        c.add(T2);

        T2.addActionListener(this);

        JScrollPane jp=new  JScrollPane(cikti);

        jp.setPreferredSize(new Dimension(320,200));

        c.add(jp);

    }

 

    public void girdiA(String string, Vector list)

    {

        // StringTokeniser sinifi String degiskenleri icin

        // Enumeration sinifinin yaptigina paralel gorev

        // gorur String'i s�raya sokarak degerlerini s�rayla verir

        StringTokenizer tokens = new StringTokenizer(string);

        while(tokens.hasMoreTokens()) {

            String test = tokens.nextToken();

            list.addElement(test);

        }

    }

 

    public void ciktiA(Vector v)

    {

        Enumeration enum = v.elements();

        while(enum.hasMoreElements())

        {

            String ans = (String)enum.nextElement();

            cikti.append(ans + " ");

        }

        cikti.append("\n");

    }

 

    public void actionPerformed(ActionEvent e)

    {

         if(e.getSource()==T1)

         {

            String stringToTokenize = T1.getText();

            girdiA(stringToTokenize,list1);

         }

        else if(e.getSource()==T2)

        {

            String stringToTokenize = T2.getText();

            girdiA(stringToTokenize,list2);

//          Iki listenin bilesim ve kesisim kümelerini hesapla.

            ansUn = set.bilesim(list1,list2);

            ansInt = set.kesisim(list1,list2);

//          sonuclari cikti alanina gonder

            cikti.setText("");

            cikti.append("İki listenin bileşim kümesi : \n");

            ciktiA(ansUn);

            cikti.append("İki listenin kesişim kümesi : \n");

            ciktiA(ansInt);

        }

    } //actionPerformed metodunun sonu

      public static void main(String[] args)

      {

      SetTestSWF_2000 pencere = new SetTestSWF_2000();

      pencere.addWindowListener(new BasicWindowMonitor());

      pencere.setSize(400,350);

      pencere.setVisible(true);

      }

 

    }

 

11007.JPG

Şekil 11.7 Vector sınıfını kullanarak iki kumenin bileşim ve kesişim kümelerini hesaplayan SetTestSWF_2000 programı  JFrame çıktısı

 

11.4 LIST(LİSTE) SINIFI

 

Yukarıdaki vektor sınıfında ilk defa dinamik hafıza kullanabilen (vektor boyutunu program çalışırken değiştirebilen) Vector sınıfını inceledik. Eğer vektor boyutları program çalışırken azalıyor veya çoğalıyorsa, boyutlu değişkenler yerine dinamik hafıza kullanımı toplam bilgisayar hafızası kullanımı açısında çok daha verimlidir. Dinamik data yapıları sadece vektorden ibaret değildir. List(liste), Stack(dizin) ve Queue (sıra) ve Tree(agaç) yapıları da oldukça sık kullanılar dinamik yapıları teşkil eder. Bunlardan List yapısının özellikleri şunlardır :

·           Listenin ilk elemanından önce veya son elemanından sonra listeye dinamik eleman ilavesi yapılabilir.

·          Listenin herhangibir ara noktasına yeni eleman ilave edilemez.

·          Listenin ilk elemanı veya son elemanı listeden çekilebilir.

·          Listenin herhangi bir ara noktasından eleman çekilemez.

 

Burada List kavramının daha iyi anlaşılabilmesi için önce kendi List sınıfımız oluşturulmuş ve bir örnek problemde kullanlmıştır. Bu program örneklerine bir göz atalım.

Program 11.9 List.java programı. Bu program List yapısını tanımlayan ListNode ve List sınıflarını içerir

 

class ListNode
{
  Object data;
  ListNode next;
  ListNode(Object o) {this(o,null);}
  ListNode(Object o,ListNode nextNode)
  {
  data=o;
  next=nextNode;
  }
  Object getObject() {return data;}
  ListNode getnext() {return next;}
}
 

public class List
{
//Liste
  private ListNode firstNode;
  private ListNode lastNode;
  private String name;

  public List(String s)
  {
  name=s;
  firstNode=lastNode=null;
  }
  public List(){this("Liste");}
  public synchronized void insertAtFront(Object insertItem)
  {
  if( isEmpty() )
      firstNode = lastNode = new ListNode(insertItem);
  else
     firstNode = new ListNode(insertItem,firstNode);
  }
  public synchronized void insertAtBack(Object insertItem)
  {
  if(isEmpty())
      firstNode=lastNode=new ListNode(insertItem);
  else
     lastNode=lastNode.next=new ListNode(insertItem);
  }

  public synchronized Object removeFromFront()
  throws EmptyListException
  {
  Object removeItem=null;
  if(isEmpty())
     throw new EmptyListException(name);
  removeItem=firstNode.data;
  if(firstNode.equals(lastNode))
     firstNode=lastNode=null;
  else
     firstNode=firstNode.next;
  return removeItem;
  } 
  public synchronized Object removeFromBack() 
  throws EmptyListException
  {
  Object removeItem=null;
  if(isEmpty())
     throw new EmptyListException(name);
  removeItem=lastNode.data;
  if(firstNode.equals(lastNode))
     firstNode=lastNode=null;
  else
  {
     ListNode current=firstNode;
     while(current.next != lastNode)
        current=current.next;
     lastNode=current;
     current.next=null;
  }
  return removeItem;
  }

  public boolean isEmpty() {return firstNode==null; }

  //türkçe eşdeğer metodlar
  public boolean bosmu() {return isEmpty(); }
  public synchronized void oneEkle(Object o) {insertAtFront(o);}
  public synchronized void arkayaEkle(Object o) {insertAtBack(o);}
  public synchronized Object ondenCikar() {return removeFromFront();}
  public synchronized Object arkadanCikar() {return removeFromBack();}

  public void print()
  {
    if(bosmu())
    {
      System.out.print(" Bos "+name); 
      return;
    }
    System.out.print(" "+name+" : ");
    ListNode current=firstNode;
    while(current!=null)
    {
    System.out.print(current.data.toString()+" ");
    current=current.next;
    }
    System.out.println("\n");
  } 
}

 

Program 11.10 : EmptyListException sınıfının EmptyListException dosyasındaki tanımı

  

public class EmptyListException extends RuntimeException
{
  public EmptyListException(String name)
  {
    super(" "+name+" bos ");
  }
}

 

Program 11.11 : List yapısını  kullanan örnek program ListTest.java

 

import List;
import EmptyListException;

public class ListTest
{
  public static void main(String args[])
  {
    List objList=new List();
    Boolean b=new Boolean(true);
    Character c=new Character('$');
    Integer i=new Integer(34567);
    String s=new String("hello");
    objList.insertAtFront(b);
    objList.print();
    objList.insertAtFront(c);
    objList.print();
    objList.insertAtFront(i);
    objList.print();
    objList.insertAtFront(s);
    objList.print();
    Object removedObj;
    try{
       removedObj=objList.removeFromFront();
       System.out.print(removedObj.toString()+" cikarildi");
       objList.print();
       removedObj=objList.removeFromFront();
       System.out.print(removedObj.toString()+" cikarildi");
       objList.print();
       removedObj=objList.removeFromBack();
       System.out.print(removedObj.toString()+" cikarildi");
       objList.print();
       removedObj=objList.removeFromBack();
       System.out.print(removedObj.toString()+" cikarildi");
       objList.print();
       }
       catch(EmptyListException e) {System.out.println("\n"+e.toString());}
  }
}

   

 

ListTest programının sonucu :


List yapısını  kullanan örnek program ListTest.java nın çıktısı  

 

 Liste : true 
 Liste : $ true 
 Liste : 34567 $ true 
 Liste : hello 34567 $ true 
hello cikarildi Liste : 34567 $ true 
34567 cikarildi Liste : $ true 
true cikarildi Liste : $ 
$ cikarildi Bos Liste

 

Burada List sınıfının girdisinin Object sınıfı  olduğun dikkatinizi çekelim. Object sınıfı yine dinamik object değişken yapıları olarak tanımlanan Double, Byte, String, Integer, Boolean, Float, Short, Long gibi değişken türleri için kullanılan sınıfların abstract sınıfını teşkil eder. Bu yüzden bu sınıfların hepsini temsil edebilir ve yerlerine kullanılabilir (genel bir sınıftır.). Bu sınıflar normal değişken türlerine dönüştürülebilirler. (daha önce de kullandığımız intValue(), doubleValue() gibi metotları kullanarak)

 

Object sınıfının temel tanımı (metodtanımları olmadan) şu şekildedir.

 

package java.lang;

public class Object {

    private static native void registerNatives();

    static {

        registerNatives();

    }

    public final native Class getClass();

    public native int hashCode();

    public boolean equals(Object obj

    protected native Object clone() throws CloneNotSupportedException;

    public String toString()

    public final native void notify();

    public final native void notifyAll();

    public final native void wait(long timeout) throws InterruptedException;

    public final void wait(long timeout, int nanos) throws InterruptedException ;

    public final void wait() throws InterruptedException ;

    protected void finalize() throws Throwable;

}

 

burada geçen native sözcüğünün anlamak istiyorsanız, 14 üncü bölümü inceleyebilirsiniz. Bu terim metodun anadilde (native) yazıldığını belirtir.

 

Java.util paketinde List sınıfı tanımlanmıştır. Yukarıda kendi tanımladığımız List ile yapabildiklerimizi ve daha fazlasını tanımlı List paketiyle a gerçekleştirebiliriz.

 

package java.util;

public interface List extends Collection {

    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator iterator();

    Object[] toArray();

    Object[] toArray(Object a[]);

    boolean add(Object o);

    boolean remove(Object o);

    boolean containsAll(Collection c);

    boolean addAll(Collection c);

    boolean addAll(int index, Collection c);

    boolean removeAll(Collection c);

    boolean retainAll(Collection c);

    void clear();

    boolean equals(Object o);

    int hashCode();

    Object get(int index);

    Object set(int index, Object element);

    void add(int index, Object element);

    Object remove(int index);

    int indexOf(Object o);

    int lastIndexOf(Object o);

    ListIterator listIterator();

    ListIterator listIterator(int index);

    List subList(int fromIndex, int toIndex);

}

 

List sınıfıyla birlikte kullanılmak üzere ListIterator interface’i tanımlanmıştır.

/*

package java.util;

public interface ListIterator extends Iterator {

    boolean hasNext();

    Object next();

    boolean hasPrevious();

    Object previous();

    int nextIndex();

    int previousIndex();

    void remove();

    void set(Object o);

    void add(Object o);

}

 

Şimdi bu iki sınıfın kullanımını bir örnekle gösterelim.

 

Program 11.12 : List yapısını  kullanan örnek program MovingPlanets.java

 

import java.util.List;

import java.util.ListIterator;

import java.util.Iterator;

import java.util.ArrayList;

import javax.swing.JOptionPane;

 

public class MovingPlanets {

  public static void main (String args[]) {

    String names[] = {"Mercür", "Venüs", "Dünya",

      "Mars", "Jupiter", "Satürn", "Uranüs",

      "Neptün", "Pluto"};

    int namesLen = names.length;

    List planets = new ArrayList();

    for (int i=0; i < namesLen; i++) {

      planets.add (names[i]);

    }

    ListIterator lit = planets.listIterator();

    String s;

    lit.next();

    lit.next();

    s = (String)lit.next();

    lit.remove();

    lit.next();

    lit.next();

    lit.next();

    lit.add(s);

    lit.next();

    lit.previous();

    lit.previous();

    s = (String)lit.previous();

    lit.remove();

    lit.next();

    lit.next();

    lit.add(s);

 

    Iterator it = planets.iterator();

    String ss="";

    while (it.hasNext()) {ss+=it.next()+"\n";}

    JOptionPane.showMessageDialog(null,ss);

    System.exit(0);

  }

}

 

11008.JPG

Şekil 11.08 List sınıfı, MovingPlanets çıktısı

 

List sınıfının bir alt sınıfı da LinkedList sınıfıdır. LinkedList sınıfı List sınıfında olmayan ilave metodlar tanımlamıştır.

 

public class LinkedList extends AbstractSequentialList

                                        implements List, Cloneable, java.io.Serializable

{

    private transient Entry header;

    private transient int size;

    public LinkedList()

     public LinkedList(Collection c)

    public Object getFirst()

    public Object getLast()

    public Object removeFirst()

    public Object removeLast()

    public void addFirst(Object o)

    public void addLast(Object o)

    public boolean contains(Object o)

    public int size()

    public boolean add(Object o)

    public boolean remove(Object o)

    public boolean addAll(Collection c)

    public boolean addAll(int index, Collection c)

    public void clear()

    public Object get(int index)

    public Object set(int index, Object element

    public void add(int index, Object element)

    public Object remove(int index)

    public int indexOf(Object o)

    public int lastIndexOf(Object o) */

    public ListIterator listIterator(int index)  

}

 

Bu sınıfı kullanan küçük bir örnek problemi inceleyelim :

 

Program 11.13 : LinkedList yapısını  kullanan örnek program MovingPlanets.java

 

import java.util.List;

import java.util.ListIterator;

import java.util.Iterator;

import java.util.ArrayList;

 

import javax.swing.JOptionPane;

 

public class GezegenlerVeaylarListesi {

  static class Gezegen {

    private String isim;

    private int aySayisi;

    Gezegen (String s, int aylar) {

      isim = s;

      aySayisi = aylar;

    }

    public String toString() {

      return getClass().getName() + "[" + isim + "-" + aySayisi + "]";

    }

    public final String getName() {

      return isim;

    }

    public final int getaySayisi () {

      return aySayisi;

    }

  }

  public static void main (String args[]) {

    String names[] = {"Mercür", "Venüs", "Dünya",

      "Mars", "Jupiter", "Satürn", "Uranüs",

      "Neptün", "Pluto"};

    int aylar[] = {0, 0, 1, 2, 16, 18, 17, 8, 1};

    int namesLen = names.length;

    List Gezegens = new ArrayList (namesLen);

    for (int i=0; i < namesLen; i++) {

      Gezegens.add (new Gezegen (names[i], aylar[i]));

    }

    String ss="";

    for (int i=Gezegens.size()-1; i >= 0; --i)

    {

      Gezegen p = (Gezegen)(Gezegens.get (i));

 

      ss+=p.getName() + " : " + p.getaySayisi()+"\n";

    }

    JOptionPane.showMessageDialog(null,ss);

    System.exit(0);

  }

}

 

Program çıktısı

 

11009.JPG

Şekil 11.09 Linkedlist sınıfı, GezegenlerVeaylarListesi çıktısı

 

LinkList Bölüm 11.4’de incelediğimiz Stack(dizi) yapısı ve bölüm 11.5 de incelediğimiz queue(sıra) yapısı yerine kullanılabilir.

 

11.5 DİZİ (STACK) SINIFI


Diziler veya ingilizce adıyla Stack aslında üstte tanımladığımız List sınıfının bir alt sınıfıdır. dizin listeye göre daha sınırlı olan şu koşullara sahiptir :

 

·           Dizide son elemandan sonra listeye dinamik eleman ilavesi yapılabilir.

·          Dizinin herhangibir ara noktasına yeni eleman ilave edilemez.

·          Dizinin sadece son  elemanı listeden çekilebilir.

·          Listenin herhangi bir ara noktasından eleman çekilemez.

 

Yukardaki kendi tanımladığımız List (Program 11.5,11.6)  kullanarak oluşturduğumuz dizi programı ve diziyi kullnan bir test programı aşağıda verilmiştir.

Program 11.14 :  dizi sınıfının dizi.java dosyasındaki tanımları

 

public class dizi extends List
{
  public dizi() {super("dizi");}
  public synchronized void push(Object o)
  {insertAtFront(o);}
  public synchronized void ekle(Object o)
  {insertAtFront(o);}
  public synchronized Object pop() throws EmptyListException
  {return removeFromFront();}
  public synchronized Object cek() throws EmptyListException
  {return removeFromFront();}

  public boolean isEmpty() {return super.isEmpty();}
  public boolean bosmu() {return super.isEmpty();}
  public void print() {super.print();}
}

 

Program 11.15 :  dizi sınıfının diziTesti.java dosyasındaki örnek kullanımı  

 

import bolum11.dizi;
import bolum11.EmptyListException;

public class diziTesti
{
public static void main(String args[])
{
dizi d=new dizi();
Boolean b=new Boolean(true);
Character c=new Character('$');
Integer i=new Integer(34567);
String s=new String("hello");
d.ekle(b);
d.print();
d.ekle(c);
d.print();
d.ekle(i);
d.print();
d.ekle(s);
d.print();
Object cekilen;
try
{
while(true)
 {
 cekilen=d.cek();
 System.out.println(cekilen.toString()+" diziden cekildi");
 d.print();
 }
}
catch(EmptyListException e)
{System.err.println("\n"+e.toString());}
}
}

 
dizi yapısını  kullanan örnek program diziTesti.java’nın çıktısı  

 

 dizi : true 

 dizi : $ true 

 dizi : 34567 $ true 

 dizi : hello 34567 $ true 

hello diziden cekildi
 dizi : 34567 $ true 

34567 diziden cekildi
 dizi : $ true 

$ diziden cekildi
 dizi : true 

true diziden cekildi
 Bos dizi

 

yukarıda tanımlanan LinkedList sınıfının addFirst()/removeFirst() metodlarını kullanarak da stack oluşturabiliriz.

 

java.util paketinde vector sıfının yanı sıra Stack  sınıfı da tanımlanmıştır. Java Stack sınıfında
push, pop ve peek metotları vardır. push ve pop dizin programını aynısıdır. peek ise listenin en sonundaki elemanın değerini bu elemanı listeden uzaklaştırmadan alır. (pop ile push beraber kullanılarak da aynı işi yapabilirler)

Bu sınıfın tanımı :

 

public class Stack extends Vector

{

 public Stack();

 public Boolean empty();

 public synchronized Object peek();

 public synchronized Object pop();

 public synchronized Object push(Object obj);

 public synchronized int search(Object obj);

}

Stack sınıfının metotlarının  ne olduğunu daha detaylı inceleyecek olursak:

 

  push  
  public Object push(Object item)
     stack'in üstüne yeni eleman ilave eder
  pop
 
  public synchronized Object pop()
     Stakin en tepesindeki elemanı çeker (Stack dizisinden kaldırır ve değerini return eder)
     Stack'in boş olması halinde EmptyStackException gönderir.
  peek
  public synchronized Object peek()
 
  Stack'in en tepesindeki elemanın değerini okur(Stack dizisinden kaldırmaz ve sadece değerini    return eder)
  Stack'in boş olması halinde EmptyStackException gönderir.
  empty
  public boolean empty()
 
  Stack'in boş olup olmadığını kontrol eder, boş ise true, dolu ise false değeri gönderir.
     Tests if this stack is empty.
  search
  public synchronized int search(Object o)
     Stack'in içindeki istenen Object'in yerini verir. Eğer object Stack'de yok ise -1 değeri verir
 

Burada hemen Stack sınıfının Vector sınıfının alt sınıfı olduğunu ve Vector sınıfında mevcut olan tüm metotlar Stack metotunda da geçerli olduğunu da hatırlatalım.

 

şimdi bir örnek problemde bu sınıfın nasıl kullanıldığına bakalım :

 

Program 11.16 : java.util kütüphanesinde yer alan Stack yapısını  kullanan örnek program StackTesti.java  

import java.util.*;

 

public class StackTesti
{
public static void main(String args[])
{
StackTesti st=new StackTesti();
Stack d=new Stack();
Boolean b=new Boolean(true);
Character c=new Character('$');
Integer i=new Integer(34567);
String s=new String("hello");
d.push(b);
st.print(d);
d.push(c);
st.print(d);
d.push(i);
st.print(d);
d.push(s);
st.print(d);
Object bakilan;
Object cekilen;
try
{
while(true)
 {
 bakilan=d.peek();
 System.out.println(bakilan.toString()+" de§erine bakildi");
 st.print(d);
 cekilen=d.pop();
 System.out.println(cekilen.toString()+" de§eri listeden cekildi ");
 st.print(d);
 System.out.println("---------------------");
 }
}
catch(EmptyStackException e)
{System.err.println("\n"+e.toString());}
}

public void print(Stack di)
{
 Enumeration enum=di.elements();
 StringBuffer buf=new StringBuffer();
 while(enum.hasMoreElements())
   buf.append(enum.nextElement()).append(" ");
 System.out.println(buf.toString());
}
}


java.util kütüphanesinde yer alan Stack yapısını  kullanan örnek program StackTesti.java nın çıktısı  

true 
true $ 
true $ 34567 
true $ 34567 hello 
hello degerine bakildi
true $ 34567 hello 
hello degeri listeden cekildi 
true $ 34567 
---------------------
34567 degerine bakildi
true $ 34567 
34567 degeri listeden cekildi 
true $ 
---------------------
$ degerine bakildi
true $ 
$ degeri listeden cekildi 
true 
---------------------
true degerine bakildi
true 
true degeri listeden cekildi 
---------------------

 

11.6 SIRA (QUEUE) SINIFI

 

Sıra veya ingilizce adıyla queue aslında üstte tanımladığımız List sınıfının bir alt sınıfıdır. sıra listeye göre daha sınırlı olan şu koşullara sahiptir :

·           Sırada son elemandan sonra listeye dinamik eleman ilavesi yapılabilir.

·          Sıranın herhangibir ara noktasına yeni eleman ilave edilemez.

·          Sıranın sadece ilk  elemanı listeden çekilebilir.

·          Sıranın herhangi bir ara noktasından eleman çekilemez.

Sıra kavramının oldukça yaygın olarak kullanıldığı ülkemizde oldukça yararlı olabilecek bir sınıfı değilmi?

Yukardaki List tanımını kullanarak oluşturduğumuz sıra programı ve sırayıi kullanan bir test programı aşağıda verilmiştir.


Program 11.17 : sira sınıfının sira.java dosyasındaki tanımları

 

public class sira extends List
{
  public sira() {super("sira");}
  public synchronized void sirayagir(Object o)
  {arkayaEkle(o);}
  public synchronized Object siranGeldi() throws EmptyListException
  {return ondenCikar();}
  public boolean isEmpty() {return super.isEmpty();}
  public boolean bosmu() {return super.isEmpty();}
  public void print() {super.print();}
}

 

Program 11.18 : sira sınıfının siraTesti.java   dosyasındaki test programı  

import sira;
import EmptyListException;

public class siraTesti
{
public static void main(String args[])
{
sira s=new sira();
Boolean b=new Boolean(true);
Character c=new Character('$');
Integer i=new Integer(34567);
String st=new String(" merhaba ");
s.sirayagir(b);
s.print();
s.sirayagir(c);
s.print();
s.sirayagir(i);
s.print();
s.sirayagir(st);
s.print();
Object cekilen;
try
{
while(true)
 {
 cekilen=s.siranGeldi();
 System.out.println(cekilen.toString()+" sirasi geldi ”nden cikti");
 s.print();
 }
}
catch(EmptyListException e)
{System.err.println("\n"+e.toString());}
}
}

 

 sira sınıfını kullanan siraTesti.java dosyasının çıktısı

 sira : true 
 sira : true $ 
 sira : true $ 34567 
 sira : true $ 34567  merhaba 
true sirasi geldi onden cikti
 sira : $ 34567  merhaba 
$ sirasi geldi onden cikti
 sira : 34567  merhaba 
34567 sirasi geldi onden cikti
 sira :  merhaba 
 merhaba  sirasi geldi onden cikti
 Bos sira

 

Queue sınıfı Java'da direk olarak tanımlanmamıştır, ancak üstteki sıra örneginin bir benzeri Vector sınıfından bizim tarafımızdan rahatlıkla yazılabilir, veya yine LinkedList sınıfının addFirst()/removeLast() metodlarını kullanarak oluşturulabilir.


11.7 TREE(AGAÇ) SINIFI

 

Elimizdeki bir gurup boyutlu değişkenin belli bir yapıda guruplandırılması veya aranması gerektiğinde bu standart boyut kavramında oldukça kompleks bir yapı arzeder. Bilgi guruplandırma işlemini çok daha basit bir şekilde yapabilmek için Tree yapıları öngörülmektedir. Tree temel olarak Vector gibi  bir yapıdır. fakat burada her Tree noktası (Nod'u) iki değişik adrese işaret eder bu adreslerden birisi o nodedaki objenin kokdekinden daha küçük olduğu bir değeri, diğeri ise daha büyük olduğu bir değeri taşır. hiç bir değer taşımıyorsa da null değeriyle o Tree-ağaç dalı sona erer. Bu yapıyı kullanarak sayıları büyükten küçüge veyaküçükten büyüğe veya daha değişik mantıklarla direk olarak sıralamak mümkündür.

 

11010.JPG

Şekil 11.10 : Binary search Tree  (ikili arama ağacı) yapısının grafiksel gösterimi

 

11011.JPG


Şekil 11.11 Binary search Tree (ikili arama ağacı
) yapısının bir rakam setine uygulanmasının grafiksel gösterimi

 

Şekil 11.10 de ikili arama ağacı yapısının seti görülmektedir. Şekil 11.11 de ise sayısal bir örnekle yapı gösterilmiştir. Her bir dal kökü kendinden sonra gelen rakamı küçükse sol dala büyükse sağ dala göndermektedir. ve her yeni veri yeni bir dallanma oluşturmaktadır. Şimdi Tree yapısını oluşturacak bir örnek sınıfı ve onun kullanıldığı bir örnek problem sınıfını oluşturarak kavramı biraz daha açmaya çalışalım :
 

Program 11.19  : Binary search Tree (ikili arama ağacı) yapısının programlandığı TreeNode ve Tree sınıflarının ter aldığı   Tree.java programı

class TreeNode
{
  TreeNode sol;
  int data;
  TreeNode sag;

  public TreeNode(int d)
  {
  data=d;
  sol=sag=null;
  }

  public synchronized void gir(int d)
  {
  // not ayni deger iki kere girilmeye calisilirsa
  // ikinci giris dikkate alinmiyacaktir
    if(d<data)
    { if(sol==null) {sol=new TreeNode(d);}
      else         {sol.gir(d);}
    }
    else if(ddata)
    { if(sag==null) {sag=new TreeNode(d);}
      else         {sag.gir(d);}
    } 
  }
}

public class Tree
{
  private TreeNode kok;
  public Tree() {kok=null;}
  public synchronized void gir(int d)
  {
    if(kok==null) kok=new TreeNode(d);
    else kok.gir(d);
  }

  public void node_soldal_sagdal_sirala(){node_soldal_sagdal_siralayici(kok);}
  public void soldal_node_sagdal_sirala(){soldal_node_sagdal_siralayici(kok);}
  public void soldal_sagdal_node_sirala(){soldal_sagdal_node_siralayici(kok);}
  public void node_sagdal_soldal_sirala(){node_sagdal_soldal_siralayici(kok);}
  public void sagdal_node_soldal_sirala(){sagdal_node_soldal_siralayici(kok);}
  public void sagdal_soldal_node_sirala(){sagdal_soldal_node_siralayici(kok);}

  public void node_soldal_sagdal_siralayici(TreeNode node)
  {
  if(node==null) return;
  System.out.print(node.data+" ");
  node_soldal_sagdal_siralayici(node.sol);
  node_soldal_sagdal_siralayici(node.sag);
  }
  public void node_sagdal_soldal_siralayici(TreeNode node)
  {
  if(node==null) return;
  System.out.print(node.data+" ");
  node_sagdal_soldal_siralayici(node.sag);
  node_sagdal_soldal_siralayici(node.sol);
  }
  public void soldal_node_sagdal_siralayici(TreeNode node)
  {
  if(node==null) return;
  soldal_node_sagdal_siralayici(node.sol);
  System.out.print(node.data+" ");
  soldal_node_sagdal_siralayici(node.sag);
  }
  public void sagdal_node_soldal_siralayici(TreeNode node)
  {
  if(node==null) return;
  sagdal_node_soldal_siralayici(node.sag);
  System.out.print(node.data+" ");
  sagdal_node_soldal_siralayici(node.sol);
  }
  public void soldal_sagdal_node_siralayici(TreeNode node)
  {
  if(node==null) return;
  soldal_node_sagdal_siralayici(node.sol);
  soldal_node_sagdal_siralayici(node.sag);
  System.out.print(node.data+" ");
  }
  public void sagdal_soldal_node_siralayici(TreeNode node)
  {
  if(node==null) return;
  sagdal_node_soldal_siralayici(node.sag);
  sagdal_node_soldal_siralayici(node.sol);
  System.out.print(node.data+" ");
  }
}

 

Program 11.20 : Binary search Tree (ikili arama ağacı) yapısının programlandığı TreeNode ve Tree sınıflarının kullanılmasını örnekleyen TreeTest.java  programı  

   

import Tree;

 

public class TreeTest
{
  public static void main(String args[])
  {
  Tree agac=new Tree();
  int sayi;
  System.out.println("orijinal olarak Tree'ye girilen sayi dizini");
  for(int i=0;i<=6;i++)
  {
   sayi=(int)(Math.random()*45)+1;
   System.out.print(sayi+" ");
   agac.gir(sayi);
  }
  System.out.println("\nSol dal - kok - sag dal siralama : ");
  agac.soldal_node_sagdal_sirala();
  System.out.println("\nkok -Sol dal - sag dal siralama : ");
  agac.node_soldal_sagdal_sirala();
  System.out.println("\nSol dal - sag dal - kok siralama : ");
  agac.soldal_sagdal_node_sirala();
  System.out.println("\nSag dal - kok - sol dal siralama : ");
  agac.sagdal_node_soldal_sirala();
  System.out.println("\nkok -Sag dal - sol dal siralama : ");
  agac.node_sagdal_soldal_sirala();
  System.out.println("\nSag dal - sol dal - kok siralama : ");
  agac.sagdal_soldal_node_sirala();
  }
}

 

Program 11.17 : Binary search Tree (ikili arama ağacı) yapısının programlandığı TreeNode ve Tree sınıflarının kullanılmasını örnekleyen TreeTest.java  programının sonuçları. renkli olarak işaretlenen satırların sayı dizisini küçükten büyüğe ve büyükten küçüğe sıraladığına dikkat ediniz.

 

orijinal olarak Tree'ye girilen sayi dizini
13 11 25 34 21 26 14 
Sol dal - kok - sag dal siralama : 
11 13 14 21 25 26 34 
kok -Sol dal - sag dal siralama : 
13 11 25 21 14 34 26 
Sol dal - sag dal - kok siralama : 
11 14 21 25 26 34 13 
Sag dal - kok - sol dal siralama : 
34 26 25 21 14 13 11 
kok -Sag dal - sol dal siralama : 
13 25 34 26 21 14 11 
Sag dal - sol dal - kok siralama : 
34 26 25 21 14 11 13 

 

11.8 DICTIONARY ve HASHTABLE  SINIFLARI

 

Şu ana kadar bu konuda gördüğümüz elemanlarda belli bir bağlantı kuralı kullanarak elemanları birbirine bağlamıştık. Bu hafıza açısından yoğun bir işlemdir. Her seferinde hafıza pozisyonunun araştırılmasını gerektirir. Java anahtar referans sağlayan daha değişik bir yapıyı da içerir. Burada her elemanın kendimiz tarafından verilen bir referans değeri mevcuttur, ve elemanı bulmak için bu referansı kullanabiliriz. Bu gurubun abstract sınıfı Dictionary sınıfıdır. Dictionary sınıfının altında Hashtable sınıfı yer alır. Dictionary sınıfının tanımı :

 

package java.util;

public abstract class Dictionary

{

    public Dictionary()

    abstract public int size();

    abstract public boolean isEmpty();

    abstract public Enumeration keys();

    abstract public Enumeration elements();

    abstract public Object get(Object key);

    abstract public Object put(Object key, Object value);

    abstract public Object remove(Object key);

 

HashTable sınıfının tanımı :

 

public class Hashtable extends Dictionary implements Map, Cloneable,

                                                                                                     java.io.Serializable {

    private transient Entry table[];

    private transient int count;

    private int threshold;

    private float loadFactor;

    private transient int modCount = 0;

    private static final long serialVersionUID = 1421746759512286392L;

    public Hashtable(int initialCapacity, float loadFactor)

    public Hashtable(int initialCapacity)

    public Hashtable(Map t)

    public int size()

    public boolean isEmpty()

    public synchronized Enumeration keys()

    public synchronized Enumeration elements()

    public synchronized boolean contains(Object value)

    public boolean containsValue(Object value)

    public synchronized boolean containsKey(Object key)

    public synchronized boolean equals(Object key)

   public synchronized Object get(Object key)

    protected void rehash()

    public synchronized Object put(Object key, Object value)

    public synchronized Object remove(Object key)

    public synchronized void putAll(Map t)

    public synchronized void clear()

    public synchronized Object clone()

    public synchronized String toString()

    public Set entySet()

    public Set keySet()

    public Collection Values()

    public synchronized int hashCode()

}

 

Hashtables sınıfı temel olarak Dictionary ve Map sınıflarından türetilmiştir. Map sınıfı tanımı

 

package java.util;

public interface Map {

    int size();

    boolean isEmpty();

    boolean containsKey(Object key);

    boolean containsValue(Object value);

    Object get(Object key);

    Object put(Object key, Object value);

    Object remove(Object key);

    void putAll(Map t);

    void clear();

    public Set keySet();

    public Collection values();

    public Set entrySet();

    boolean equals(Object o);

    int hashCode();

    public interface Entry

    {

                Object getKey();

                Object getValue();

                Object setValue(Object value);

                boolean equals(Object o);

                int hashCode();

    }

}

şeklindedir.

En çok kullanacağımız Hashtable metodlarının anlamlarına bir göz atalım :

Bir referans çifti girmek için :    put(Object anahtar, Object değer)

Anahtarı vererek referans değerini çağırmak için : get(Object anahtar)

Bir elemanı silmek için : remove((Object anahtar)

Boyutu kontrol için : size()

Boş olup olmadığının kontralu için empty()

Tüm anahtarların listesini almak için : keys() veya keySet()

Tüm değerlerin listesini almak için : elements() veya entrySet()

 

Program 11.21 : Hashtable  yapısının programlandığı GezegenCaplari.java programı

 

import java.util.Enumeration;

import java.util.Hashtable;

import javax.swing.JOptionPane;

 

public class GezegenCaplari {

  public static void main (String args[]) {

    String names[] = {"Merkür", "Venüs", "Dünya",

      "Mars", "Jüpiter", "Satürn", "Uranüs",

      "Neptün", "Pluton"};

    float diameters[] = {4800f, 12103.6f, 12756.3f,

      6794f, 142984f, 120536f, 51118f, 49532f, 2274f};

    Hashtable hash = new Hashtable();

    for (int i=0, n=names.length; i < n; i++) {

      hash.put (names[i], new Float (diameters[i]));

    }

    Enumeration enum = hash.keys();

    Object obj;

    String ss="";

    while (enum.hasMoreElements()) {

      obj = enum.nextElement();

      ss+=obj + ": " + hash.get(obj)+"\n";

    }

    JOptionPane.showMessageDialog(null,ss);

    System.exit(0);

  }

}

 

11012.JPG

Şekil 11.12 HashTable sınıfını kullanan GezegenCaplari programı

 

Programdan da görüldüğü gibi çıktı hiçbir mantıksal sıralama düzeni içermemektedir, fakat burada önemli olan gezegenlerin ve çaplarının birbirleriyle olan ilişkilerinin listelenmesidir. Hashtable bu tür işlevleri en iyi bir şekilde yerine getirir.

 

11.9 ARRAYS SINIFI VE SIRALAMA

 

Arrays sınıfı boyutlu değişkenleri sıralamaya yarıyan bir java sınfıdır. Metodları:

 

public static List asList(object array[]);

b değerinin a değerinin hangi elemanında olduğunu bulan :

public static int binarySearch(<değişkentürü> a[],<değişkentürü>b);

<değişkentürü> char,double,float,int,Object,long,short değerleri alabilir, elbette Object üzerinden Objectin alt sınıfları olan String, Double, Integer gibi sınıfları da kabul eder.

İki boyutlu değişkenin birbirine eşit olup olmadığını denetleyen :

public static boolean equals(<değişkentürü> a[],<değişkentürü>b[]);

boyutlu değişkenin tüm değerlerini veya tanımlanan bir bölümünü  bir bölümünü aynı tür bir değişken atayan

public static void fill(<değişkentürü> a[],<değişkentürü>b);

public static void fill(<değişkentürü> a[],int başlangıçindisi,int bitişindisi,<değişkentürü>b);

boyutlu değişkeni sıraya sokan :

public static void sort(<değişkentürü> a[]);

public static void sort(Object a[],Comparator comp);

 

 

listeden de görüldüğü gibi tüm metodlar static metodlardır.

 

Program 11.22 : Arrays  yapısının kullanıldığı Gezegensirasi.java programı

 

import java.util.*;

import javax.swing.JOptionPane;

 

public class Gezegensirasi {

  static class InsensitiveComp implements Comparator {

    public int compare (Object a1, Object a2) {

      String s1 = a1.toString().toLowerCase();

      String s2 = a2.toString().toLowerCase();

      return s1.compareTo (s2);

    }

  }

  public static void main (String args[]) {

    String names[] = {"Mercür", "Venüs", "Dünya",

      "Mars", "Jüpiter", "Satürn", "Uranüs",

      "Neptün", "Pluto",

      "mercür", "venüs", "dünya",

      "mars", "jüpiter", "satürn", "uranüs",

      "neptün", "pluto"

    };

    Arrays.sort(names);

    int namesLen = names.length;

    String ss="";

    for (int i=0; i<namesLen; i++) {

      ss+=names[i] + " ";

    }

    ss+="\n";

    Arrays.sort(names, new InsensitiveComp());

    for (int i=0; i<namesLen; i++) {

      ss+=names[i] + " ";

    }

    ss+="\n";

    JOptionPane.showMessageDialog(null,ss);

    System.exit(0);

  }

}

 

11013.JPG

Şekil 11.13 Arrays sınıfını kullanan Gezegensirasi programı

 

programda liste ikinci kere Comparator sınıfı InsensitiveComp() kullanarak büyük ve küçük harfi göz önüne almadan sıraya sokulmuştur.

 

11.10 ALIŞTIRMALAR

 

1. H10AL1.java   : Vector sınıfı örnegi, H9O1 de boyutlu değişkenle çözülen dosyadan okunan rakamların ortalamasının bulunması.  

Program 11.23 : H10Al1.java programı, vector ve dosya girdi örneği

 

import java.io.*;
import Text;
import java.util.*;

public class H10AL1
{
  public static void main(String[] args) throws IOException
  {
    DataInputStream input; 
    Vector i= new Vector(1);
    String s1;
    Text cin= new Text();
    System.out.print("Lutfen dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile = new File(s1);
    BufferedReader b= new BufferedReader(new FileReader(myfile)); 
    int toplam=0; 
    boolean EOF=false;
    int j=0;
    while (!EOF)
    {
     try
     { 
      j++;
      i.addElement(Text.readString(b));
     }
     catch (EOFException e)
     { 
       b.close(); 
       EOF=true;
     }
    } //while
    Enumeration enum=i.elements();
    StringBuffer buf = new StringBuffer();
            while(enum.hasMoreElements())
                 {
                 buf.append(enum.nextElement());
                 Double d=new Double(buf.toString()); 
                 toplam+=d.doubleValue();
                 }
    System.out.println("Dosyanin icindeki sayilarin adedi: "+j);
    System.out.println("Ortalama: "+(double)toplam/i.size()); 
  } //main

} //class
 

Lutfen dosya ismini giriniz: c.txt
1.0 toplam: 1
2.0 toplam: 3
3.0 toplam: 6
4.0 toplam: 10
5.0 toplam: 15
6.0 toplam: 21
7.0 toplam: 28
8.0 toplam: 36
9.0 toplam: 45
10.0 toplam: 55
11.0 toplam: 66
12.0 toplam: 78
13.0 toplam: 91
14.0 toplam: 105
15.0 toplam: 120
16.0 toplam: 136
17.0 toplam: 153
18.0 toplam: 171
19.0 toplam: 190
20.0 toplam: 210
dosyanın ve yuklendigi vektorun icindeki sayilarin adedi: 20
Ortalama: 10.5

 

2. H10AL2.java : List sınıfı örnegi, H9O1 de boyutlu değişkenle çözülen dosyadan okunan rakamların ortalamasının bulunması.

 

Program 11.24 : List sınıfı ve dosyadan okuma örneği H10AL1.java

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.List;
import bolum11.EmptyListException;

public class H10AL2
{
  public static void main(String[] args) throws IOException
  {
    DataInputStream input; 
    List l= new List("H10AL2");
    String s1;
    Text cin= new Text();
    System.out.print("Lutfen dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile = new File(s1);
    BufferedReader b= new BufferedReader(new FileReader(myfile)); 
    int toplam=0; 
    boolean EOF=false;
    int j=0;
    while (!EOF)
    {
     try
     { 
      l.arkayaEkle(Text.readString(b));
      j++;
     }
     catch (EOFException e)
     { 
       b.close(); 
       EOF=true;
     }
    } //while

            while(!l.bosmu())
                 {
                 Double d=new Double((String)l.ondenCikar()); 
                 toplam+=d.doubleValue();
                 System.out.println(""+d+" toplam: "+toplam);
                 }
    System.out.println("dosyan�n ve y�klendigi listenin icindeki sayilarin adedi: "+j);
    System.out.println("Ortalama: "+(double)toplam/j); 
  } //main

} //class
 

Lutfen dosya ismini giriniz: c.txt
1.0 toplam: 1
2.0 toplam: 3
3.0 toplam: 6
4.0 toplam: 10
5.0 toplam: 15
6.0 toplam: 21
7.0 toplam: 28
8.0 toplam: 36
9.0 toplam: 45
10.0 toplam: 55
11.0 toplam: 66
12.0 toplam: 78
13.0 toplam: 91
14.0 toplam: 105
15.0 toplam: 120
16.0 toplam: 136
17.0 toplam: 153
18.0 toplam: 171
19.0 toplam: 190
20.0 toplam: 210
dosyanin ve yuklendigi listenin icindeki sayilarin adedi: 20
Ortalama: 10.5

 

3. H10AL3.java : dizi sınıfı örnegi, H9O1 de boyutlu değişkenle çözülen dosyadan okunan rakamların ortalamasının bulunması.

 

Program 11.25 : H10AL3.java,

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.dizi;
import bolum11.EmptyListException;
//dizi ornegi

public class H10AL3
{
  public static void main(String[] args) throws IOException
  {
    DataInputStream input; 
    dizi l= new dizi();
    String s1;
    Text cin= new Text();
    System.out.print("Lutfen dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile = new File(s1);
    BufferedReader b= new BufferedReader(new FileReader(myfile)); 
    int toplam=0; 
    boolean EOF=false;
    int j=0;
    while (!EOF)
    {
     try
     {
      l.ekle(Text.readString(b));
      j++;
     }
     catch (EOFException e)
     { 
       b.close(); 
       EOF=true;
     }
    } //while

            while(!l.bosmu())
                 {
                 Double d=new Double((String)l.cek()); 
                 toplam+=d.doubleValue();
                 System.out.println(""+d+" toplam: "+toplam);
                 }
    System.out.println("dosyanin ve yuklendigi listenin icindeki sayilarin adedi: "+j);
    System.out.println("Ortalama: "+(double)toplam/j); 
  } //main

} //class
 

Lutfen dosya ismini giriniz: c.txt
20.0 toplam: 20
19.0 toplam: 39
18.0 toplam: 57
17.0 toplam: 74
16.0 toplam: 90
15.0 toplam: 105
14.0 toplam: 119
13.0 toplam: 132
12.0 toplam: 144
11.0 toplam: 155
10.0 toplam: 165
9.0 toplam: 174
8.0 toplam: 182
7.0 toplam: 189
6.0 toplam: 195
5.0 toplam: 200
4.0 toplam: 204
3.0 toplam: 207
2.0 toplam: 209
1.0 toplam: 210
dosyanin ve yuklendigi listenin icindeki sayilarin adedi: 20
Ortalama: 10.5

 

1.        H10AL4.java : dizi sınıfı örnegi, H9O1 de boyutlu değişkenle çözülen dosyadan okunan rakamların ortalamasının bulunması.

Problem 11.26 : H10AL4.java dizi sınıfı örneği

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.sira;
import bolum11.EmptyListException;

//sira ornegi
public class H10AL4
{
  public static void main(String[] args) throws IOException
  {
    DataInputStream input; 
    sira l= new sira();
    String s1;
    Text cin= new Text();
    System.out.print("Lutfen dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile = new File(s1);
    BufferedReader b= new BufferedReader(new FileReader(myfile)); 
    int toplam=0; 
    boolean EOF=false;
    int j=0;
    while (!EOF)
    {
     try
     { 
      l.sirayagir(Text.readString(b));
      j++;
     }
     catch (EOFException e)
     { 
       b.close(); 
       EOF=true;
     }
    } //while
            while(!l.bosmu())
                 {
                 Double d=new Double((String)l.siranGeldi()); 
                 toplam+=d.doubleValue();
                 System.out.println(""+d+" toplam: "+toplam);
                 }
    System.out.println("dosyanin ve yuklendigi listenin icindeki sayilarin adedi: "+j);
    System.out.println("Ortalama: "+(double)toplam/j); 
  } //main

} //class
 

Lutfen dosya ismini giriniz: c.txt
1.0 toplam: 1
2.0 toplam: 3
3.0 toplam: 6
4.0 toplam: 10
5.0 toplam: 15
6.0 toplam: 21
7.0 toplam: 28
8.0 toplam: 36
9.0 toplam: 45
10.0 toplam: 55
11.0 toplam: 66
12.0 toplam: 78
13.0 toplam: 91
14.0 toplam: 105
15.0 toplam: 120
16.0 toplam: 136
17.0 toplam: 153
18.0 toplam: 171
19.0 toplam: 190
20.0 toplam: 210
dosyanin ve yuklendigi listenin icindeki sayilarin adedi: 20
Ortalama: 10.5

 

2.        H10AL5.java : Stack sınıfı örnegi, H9O1 de boyutlu değişkenle çözülen dosyadan okunan rakamların ortalamasının bulunması.

 

Problem 11.27 H10Al5.java Stack sınıfı örneği
 

import java.io.*;
import Text;
import java.util.*;

//Stack - dizi ornegi

public class H10AL5
{
  public static void main(String[] args) throws IOException
  {
    DataInputStream input; 
    Stack l= new Stack();
    String s1;
    Text cin= new Text();
    System.out.print("Lutfen dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile = new File(s1);
    BufferedReader b= new BufferedReader(new FileReader(myfile)); 
    int toplam=0; 
    boolean EOF=false;
    int j=0;
    while (!EOF)
    {
     try
     { 
      l.push(Text.readString(b));
      j++;
     }
     catch (EOFException e)
     { 
       b.close(); 
       EOF=true;
     }
    } //while
            while(!l.empty())
                 {
                 Double d=new Double((String)l.pop()); 
                 toplam+=d.doubleValue();
                 System.out.println(""+d+" toplam: "+toplam);
                 }
    System.out.println("dosyanin ve yuklendigi listenin icindeki sayilarin adedi: "+j);
    System.out.println("Ortalama: "+(double)toplam/j); 
  } //main

} //class
 

Lutfen dosya ismini giriniz: c.txt
20.0 toplam: 20
19.0 toplam: 39
18.0 toplam: 57
17.0 toplam: 74
16.0 toplam: 90
15.0 toplam: 105
14.0 toplam: 119
13.0 toplam: 132
12.0 toplam: 144
11.0 toplam: 155
10.0 toplam: 165
9.0 toplam: 174
8.0 toplam: 182
7.0 toplam: 189
6.0 toplam: 195
5.0 toplam: 200
4.0 toplam: 204
3.0 toplam: 207
2.0 toplam: 209
1.0 toplam: 210
dosyanin ve yuklendigi listenin icindeki sayilarin adedi: 20
Ortalama: 10.5

Alıştırmalarda kullanılan c.txt dosyası :
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

 

6.  SetTest.java programını inceleyiniz. Kesişim kumesiyle bileşim kumesinin farkını oluşturan kümeyi hesaplayan bir metot yazınız ve test programına da ekleyerek çalıştırınız.

 

  1. H1OD1.java
    veri dosyası e.txt'e e dizisini giriniz. d.txt'e d dizisini giriniz. program setText'ti inceleyiniz. iki dizinin bileşim kümesini ed.txt dosyasına yazdırınız.

 

Program 11.28 H10OD1.java iki dizinin bileşim kümesini vektor sınıfını kullanarak hesaplayan program

 

import java.io.*;
import Text;
import java.util.*;

public class H10OD1
{
    public void girdiA(String string, Vector list)
    {
        // StringTokeniser sinifi String degiskenleri icin
        // Enumeration sinifinin yaptigina paralel gorev
        // gorur String'i s�raya sokarak degerlerini s�rayla verir
        StringTokenizer tokens = new StringTokenizer(string);
        while(tokens.hasMoreTokens()) {
            String test = tokens.nextToken();
            list.addElement(test);
        }
    }

    public static String ciktiA(Vector v)
    {
        StringBuffer cikti=new StringBuffer();
        Enumeration enum = v.elements();
        while(enum.hasMoreElements())
        {
            String ans = (String)enum.nextElement();
            cikti.append(ans + " ");
        }
       return cikti.toString();
    }

  public static void main(String[] args) throws IOException
  {
    SetA set=new SetA();
    DataInputStream input;
    Vector v1= new Vector(1);
    Vector v2= new Vector(1);
    Vector v=new Vector(1);
    String s1,s2;
    Text cin= new Text();
    System.out.print("Lutfen ilk dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile1 = new File(s1);
    BufferedReader b1= new BufferedReader(new FileReader(myfile1)); 
    System.out.print("Lutfen ikinci dosya ismini giriniz: ");
    s2 = cin.readString();
    File myfile2 = new File(s2);
    BufferedReader b2= new BufferedReader(new FileReader(myfile2)); 
    int toplam=0; 
    boolean EOF=false;
    while (!EOF)
    {
     try
     { 
      v1.addElement(Text.readString(b1));
     }
     catch (EOFException e)
     { 
       b1.close(); 
       EOF=true;
     }
    } //while
    EOF=false;
    while (!EOF)
    {
     try
     { 
      v2.addElement(Text.readString(b2));
     }
     catch (EOFException e)
     { 
       b2.close(); 
       EOF=true;
     }
    } //while
    v=set.bilesim(v1,v2);
    System.out.println(ciktiA(v));
    PrintWriter cfout=new PrintWriter(new BufferedWriter(new FileWriter("de.txt"))); 
    cfout.println(ciktiA(v));
    cfout.close();
    toplam=0;
    Enumeration enum=v.elements();
    while(enum.hasMoreElements())
    {
    Double d=new Double((String)enum.nextElement()); 
    toplam+=d.doubleValue();
    }
    System.out.println("dosyanin ve yuklendigi vektorun icindeki sayilarin adedi: "+v.size());
    System.out.println("Ortalama: "+(double)toplam/v.size()); 
  } //main

} //class
 

 

sonuçlar :
 

Lutfen ilk dosya ismini giriniz: e.txt
Lutfen ikinci dosya ismini giriniz: f.txt
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 1 2 3 4 5 6 7 8 9 
dosyanin ve yuklendigi vektorun icindeki sayilarin adedi: 29
Ortalama: 15.0

e.txt:

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

d.txt

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

de.txt

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 1 2 3 4 5 6 7 8 9 

 

8.  H10OD2

alıştırma 7 deki  sonuçları Tree sınıfını kullanarak küçükten büyüge doğru sıralanmış olarak ed.txt dosyasına yazdırınız.

Program 11.29 : H10OD2.java

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.Tree1;

public class H10OD2
{
    public void girdiA(String string, Vector list)
    {
        // StringTokeniser sinifi String degiskenleri icin
        // Enumeration sinifinin yaptigina paralel gorev
        // gorur String'i s�raya sokarak degerlerini s�rayla verir
        StringTokenizer tokens = new StringTokenizer(string);
        while(tokens.hasMoreTokens()) {
            String test = tokens.nextToken();
            list.addElement(test);
        }
    }

    public static String ciktiA(Vector v)
    {
        StringBuffer cikti=new StringBuffer();
        Enumeration enum = v.elements();
        while(enum.hasMoreElements())
        {
            String ans = (String)enum.nextElement();
            cikti.append(ans + " ");
        }
       return cikti.toString();
    }

  public static void main(String[] args) throws IOException
  {
    SetA set=new SetA();
    Tree1 t=new Tree1();
    DataInputStream input;
    Vector v1= new Vector(1);
    Vector v2= new Vector(1);
    Vector v=new Vector(1);
    String s1,s2;
    Text cin= new Text();
    System.out.print("Lutfen ilk dosya ismini giriniz: ");
    s1 = cin.readString();
    File myfile1 = new File(s1);
    BufferedReader b1= new BufferedReader(new FileReader(myfile1)); 
    System.out.print("Lutfen ikinci dosya ismini giriniz: ");
    s2 = cin.readString();
    File myfile2 = new File(s2);
    BufferedReader b2= new BufferedReader(new FileReader(myfile2)); 
    int toplam=0; 
    boolean EOF=false;
    while (!EOF)
    {
     try
     { 
      v1.addElement(Text.readString(b1));
     }
     catch (EOFException e)
     { 
       b1.close(); 
       EOF=true;
     }
    } //while
    EOF=false;
    while (!EOF)
    {
     try
     { 
      v2.addElement(Text.readString(b2));
     }
     catch (EOFException e)
     { 
       b2.close(); 
       EOF=true;
     }
    } //while
    v=set.bilesim(v1,v2);
            Enumeration enum=v.elements();
            while(enum.hasMoreElements())
                 {
                 Integer d=new Integer((String)enum.nextElement()); 
                 t.gir(d.intValue());
                 }

    PrintWriter cfout=new PrintWriter(new BufferedWriter(new FileWriter("de.txt"))); 
    System.out.println(t.soldal_node_sagdal_sirala());
    cfout.println(t.soldal_node_sagdal_sirala());
    cfout.close();
  } //main

} //class

de.txt :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 

e.txt :

11 13 24 15 17 22 18 19 12 20 21 23  25 14 26 27 16 28 29 10

d.txt

1 8 9 11 12 3 4 13 10 18 19 14 15 16 2 5 6 7 17 20

sonuç (ekran)

Lutfen ilk dosya ismini giriniz: d.txt
Lutfen ikinci dosya ismini giriniz: e.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 

 

Program 11.30 Tree1.java ,

 

package bolum11;

class TreeNode
{
  TreeNode sol;
  int data;
  TreeNode sag;

  public TreeNode(int d)
  {
  data=d;
  sol=sag=null;
  }

  public synchronized void gir(int d)
  {
  // not ayni deger iki kere girilmeye calisilirsa
  // ikinci giris dikkate alinmiyacaktir
    if(d<data)
    { if(sol==null) {sol=new TreeNode(d);}
      else         {sol.gir(d);}
    }
    else if(ddata)
    { if(sag==null) {sag=new TreeNode(d);}
      else         {sag.gir(d);}
    } 
  }
}

public class Tree1
{
  private TreeNode kok;
  public Tree1() {kok=null;}
  public synchronized void gir(int d)
  {
    if(kok==null) kok=new TreeNode(d);
    else kok.gir(d);
  }

  public String node_soldal_sagdal_sirala(){return node_soldal_sagdal_siralayici(kok);}
  public String soldal_node_sagdal_sirala(){return soldal_node_sagdal_siralayici(kok);}
  public String sagdal_node_soldal_sirala(){return sagdal_node_soldal_siralayici(kok);}

  public String node_soldal_sagdal_siralayici(TreeNode node)
  {
  String s="";
  if(node==null) return s;
  s=s+node.data+" ";
  s=s+node_soldal_sagdal_siralayici(node.sol);
  s=s+node_soldal_sagdal_siralayici(node.sag);
  return s;
  }

  public String soldal_node_sagdal_siralayici(TreeNode node)
  {
  String s="";
  if(node==null) return s;
  s=s+soldal_node_sagdal_siralayici(node.sol);
  s=s+node.data+" ";
  s=s+soldal_node_sagdal_siralayici(node.sag);
  return s;
  }

  public String sagdal_node_soldal_siralayici(TreeNode node)
  {
  String s="";
  if(node==null) return s;
  s=s+sagdal_node_soldal_siralayici(node.sol);
  s=s+node.data+" ";
  s=s+sagdal_node_soldal_siralayici(node.sag);
  return s;
  }
}

 

  1. H10OD3
    Ekrandan bir rakam dizisini tek bir String olarak giriniz. Girdiginiz diziyi StringTokenezer sınıfı bir gerçek sayi rakam dizisine  dönüştürünüz ve vector sınıfına yükleyiniz. daha sonra vector elemanlarının karesinin ortalamasını çıktı olarak veriniz.
     

Program 11.31 : H10OD3.java

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.Tree1;

public class H10OD3
{
  public static void main(String[] args) throws IOException
  {
    String s1;
    Text cin= new Text();
    Vector v=new Vector();
    System.out.print("tum rakamlari giriniz : ");
    s1 = cin.readStringLine();
    StringTokenizer st=new StringTokenizer(s1);
    while(st.hasMoreTokens())
        { 
        v.addElement((String)st.nextToken());
        } 
    Enumeration enum=v.elements();
    double toplam=0; 
    while(enum.hasMoreElements())
    {
    Double d=new Double((String)enum.nextElement()); 
    double x=d.doubleValue();
    toplam+=x*x;
    System.out.println("x = "+x+"toplam = "+toplam);
    }
    System.out.println("Ortalama: "+(double)toplam/v.size()); 
  } //main
} //class

sonuclar:

tum rakamlari giriniz : 1 2 3 4 5 6 7 8 9 10
x = 1.0  toplam = 1.0
x = 2.0  toplam = 5.0
x = 3.0  toplam = 14.0
x = 4.0  toplam = 30.0
x = 5.0  toplam = 55.0
x = 6.0  toplam = 91.0
x = 7.0  toplam = 140.0
x = 8.0  toplam = 204.0
x = 9.0  toplam = 285.0
x = 10.0 toplam = 385.0
Ortalama: 38.5

 

  1. H10OD4
    Ekrandan bir rakam dizisini tek bir String olarak giriniz. Girdiginiz diziyi StringTokenezer sınıfı bir gerçek sayi rakam dizisine  dönüştürünüz ve Stack sınıfına yükleyiniz. daha sonra Stack elemanlarının karesinin ortalamasını çıktı olarak veriniz.
     

Program 11.32 : H10OD4.java

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.Tree1;
// not stack vektor s�n�f�n�n bir alt s�n�f�d�r.
// bu uygulamada bu ”zellikten yararlan�lm�Ÿt�r.

public class H10OD4
{
  public static void main(String[] args) throws IOException
  {
    String s1;
    Text cin= new Text();
    Stack v= new Stack();
    System.out.print("tum rakamlari giriniz : ");
    s1 = cin.readStringLine();
    StringTokenizer st=new StringTokenizer(s1);
    while(st.hasMoreTokens())
        { 
        v.push((String)st.nextToken());
        } 
    Enumeration enum=v.elements();
    double toplam=0; 
    while(enum.hasMoreElements())
    {
    Double d=new Double((String)enum.nextElement()); 
    double x=d.doubleValue();
    toplam+=x*x;
    System.out.println("x = "+x+"toplam = "+toplam);
    }
    System.out.println("Ortalama: "+(double)toplam/v.size()); 
  } //main
} //class

sonuçlar :

tum rakamlari giriniz : x = 1.0toplam = 1.0
x = 2.0toplam = 5.0
x = 3.0toplam = 14.0
x = 4.0toplam = 30.0
x = 5.0toplam = 55.0
x = 6.0toplam = 91.0
x = 7.0toplam = 140.0
x = 8.0toplam = 204.0
x = 9.0toplam = 285.0
x = 10.0toplam = 385.0
Ortalama: 38.5

 

Program 11.33 : H10OD4a.java: ikinci program (aynı program 11.20'nin değişik yazılışı ) : H10OD4a.java

 

import java.io.*;
import Text;
import java.util.*;
import bolum11.Tree1;

public class H10OD4a
{
  public static void main(String[] args) throws IOException
  {
    String s1;
    Text cin= new Text();
    Stack v= new Stack();
    System.out.print("tum rakamlari giriniz : ");
    s1 = cin.readStringLine();
    StringTokenizer st=new StringTokenizer(s1);
    while(st.hasMoreTokens())
        { 
        v.push((String)st.nextToken());
        } 
    double toplam=0;
    double sayi=v.size();
    while(!v.isEmpty())
    {
    Double d=new Double((String)v.pop()); 
    double x=d.doubleValue();
    toplam+=x*x;
    System.out.println("x = "+x+"toplam = "+toplam);
    }
    System.out.println("Ortalama: "+(double)toplam/sayi); 
  } //main
} //class

sonuçlar :

tum rakamlari giriniz : 1 2 3 4 5 6 7 8 9 10
x = 10.0 toplam = 100.0
x = 9.0  toplam = 181.0
x = 8.0  toplam = 245.0
x = 7.0  toplam = 294.0
x = 6.0  toplam = 330.0
x = 5.0  toplam = 355.0
x = 4.0  toplam = 371.0
x = 3.0  toplam = 380.0
x = 2.0  toplam = 384.0
x = 1.0  toplam = 385.0
Ortalama: 38.5

 

  1. Java Vector uygulaması Gezegenler.java

 

Program 11.34 . Gezegenler.java vectör test programı

 

import java.util.*;

public class Gezegenler {

  static class Gezegen {

    private String isim;

    Gezegen (String s) {

      isim = s;

    }

    public String toString() {

      return getClass().getName() + "[" + isim + "]";

    }

  }

  public static void main (String args[]) {

    String isimler[] = {"Mercür", "Venüs", "Dünya",

      "Mars", "Jupiter", "Satürn", "Uranüs",

      "Neptün", "Pluto"};

    int namesLen = isimler.length;

    Vector gezegenler = new Vector (namesLen);

    for (int i=0; i < namesLen; i++) {

      gezegenler.addElement (new Gezegen (isimler[i]));

    }

    for (int i=0, n=gezegenler.size(); i < n; i++) {

      System.out.println (gezegenler.elementAt (i));

    }

  }

}

 

16.     GezegenlerveAylar.java, Vector uygulaması

 

Program 11.35 . GezegenlerveAylar.java vector test programı

 

import java.util.*;

import javax.swing.JOptionPane;

 

public class GezegenlerveAylar {

  static class Gezegen {

    private String isim;

    private int aySayisi;

    Gezegen (String s, int aylar) {

      isim = s;

      aySayisi = aylar;

    }

    public String toString() {

      return getClass().getName() + "[" + isim + "-" + aySayisi + "]";

    }

    public final String getName() {

      return isim;

    }

    public final int getMoonCount () {

      return aySayisi;

    }

  }

  public static void main (String args[]) {

    String isimler[] = {"Mercür", "Venüs", "Dünya",

      "Mars", "Jupiter", "Satürn", "Uranüs",

      "Neptün", "Pluto"};

    int aylar[] = {0, 0, 1, 2, 16, 18, 17, 8, 1};

    int namesLen = isimler.length;

    Vector planets = new Vector (namesLen);

    for (int i=0; i < namesLen; i++)

    {

      planets.addElement (new Gezegen (isimler[i], aylar[i]));

    }

     Enumeration enum = planets.elements();

    Gezegen p;

    String ss="";

    while (enum.hasMoreElements()) {

    p = (Gezegen)(enum.nextElement());

    ss+=p.getName() + " : " + p.getMoonCount()+"\n";

    }

    JOptionPane.showMessageDialog(null,ss);

    System.exit(0);

  }

}

 


<< index      < bölüm 10      > bölüm 12            bölüm başı