<< index
< bölüm 10
> bölüm 12
Bu bölümde çeşitli ileri bilgi işleme ve boyut oluşturma kavramlarına göz atacağız.
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
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.
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ı
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.
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
---------------------
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.
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
Ş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.
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.
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.
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;
}
}
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
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
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şı