// Fail Element.java
/**
* Lihtahela klass, milles elemendid paiknevad võrreldavate
* võtmete kasvavas järjestuses.
* Konkreetse informatsiooni paigutamiseks elementidesse
* tuleb seda klassi spetsialiseerida.
* @author Jaanus Poial
* @version 0.4 kevad 2001
* @since JDK 1.2
*/
public class Element implements java.util.Enumeration, Comparable {
/** elemendi asukohta määrav võti. */
Comparable voti;
/** järgmine element ahelas. */
Element jargmine;
/** vaikekonstruktor. */
Element() {
this (null, null);
}
/** võtmega konstruktor. */
Element (Comparable v) {
this (v, null);
}
/** võtme ja järgmise elemendiga konstruktor. */
Element (Comparable v, Element e) {
paneVoti (v);
paneJargmine (e);
}
/** tagastab järgmise elemendi ahelas või väärtuse null
.
*/
public Element votaJargmine() {
return jargmine;
}
/** väärtustab välja jargmine
* elemendiga e
.
*/
public void paneJargmine (Element e) {
jargmine = e;
}
/** tagastab elemendi võtme. */
public Comparable votaVoti() {
return voti;
}
/** väärtustab välja voti
* võtmega v
.
*/
public void paneVoti (Comparable v) {
voti = v;
}
/** võrdleb elemente võtmete väärtuse järgi.
*/
public int compareTo (Object element) {
return votaVoti().compareTo (((Element)element).votaVoti());
}
//========================================================================
// Standardsed ahela operatsioonid - lisa, yhilda, eemalda, otsi
//========================================================================
/** lisab elemendi ahelasse.
* @param e lisatav element.
* @return muudetud ahela algus.
*/
public Element lisa (Element e) { //annab uue alguse tagasi
if (e == null) return this; // ei olnudki soovi lisada
if (e == this) return this; // ebanormaalne situatsioon niikuinii
if (e.votaVoti().compareTo (votaVoti()) < 0) { // e.voti < this.voti
e.paneJargmine (this); // lisamine ahela algusesse
return e;
}
Element abi = this; // hakkame kohta otsima abi jarele
while (abi.votaJargmine() != null) {
if (e.votaVoti().compareTo (abi.votaJargmine().votaVoti()) < 0) {
// lisamine abi jarele
e.paneJargmine (abi.votaJargmine());
abi.paneJargmine (e);
return this;
}
abi = abi.votaJargmine();
}
abi.paneJargmine (e); // lisamine ahela loppu
e.paneJargmine (null); // igaks juhuks
return this;
} // lisa() lopp
/** yhildab ahelad this ja e.
* Mõlema ahela elemendid kloonitakse pindmiselt.
* @param e lisatava ahela algus.
* @returns yhildatud ahela algus.
*/
public Element yhilda (Element e) {
return this; // TEHA!!!!
}
/** eemaldab elemendi ahelast.
* @param e eemaldatav element.
* @return muudetud ahela algus.
*/
public Element eemalda (Element e) { //annab uue alguse voi null
if (e == null) return this; //ei eemalda midagi
if (e == this) return votaJargmine(); //esimese eemaldamine
Element abi = this;
while (abi != null) {
if (e == abi.votaJargmine()) {
abi.paneJargmine (e.votaJargmine());
}
abi = abi.votaJargmine();
}
return this;
} // eemalda() lopp
/** otsib ahelast antud võtmega elementi.
* @param voti otsitava elemendi võti.
* @return otsitav element või null
.
*/
public Element otsi (Comparable voti) { //kui ei leia, siis null
Element abi = this;
while (abi != null) {
if (voti.compareTo (abi.votaVoti()) == 0) return abi;
abi = abi.votaJargmine();
}
return null; //kui leiti varem, siis siia ei satuta
} // otsi() lopp
//==========================================================
// Votmete va"ljastamine
//==========================================================
/** teisendab ahela sõneks võtmete loetlemise teel. */
public String toString() {
StringBuffer puhver = new StringBuffer();
Element abi = this;
while (abi != null) {
puhver.append (abi.votaVoti().toString()); // voti
if (abi.votaJargmine() != null)
puhver.append (", "); // vaheeraldaja
else puhver.append (";"); // lopueraldaja
abi = abi.votaJargmine();
}
return puhver.toString(); // puhver -> String
} // toString() lopp
//======================================================================
// Enumeration
//======================================================================
/** kontrollib, kas leidub järgmist elementi. */
public boolean hasMoreElements() {
return votaJargmine() != null;
}
/** tagastab järgmise elemendi. */
public Object nextElement() throws java.util.NoSuchElementException {
if (votaJargmine() == null)
throw new java.util.NoSuchElementException();
else
return votaJargmine();
}
/** peameetod (silumiseks). */
public static void main (String[] parameetrid) {
System.out.println ("Algus"); // Algus
Element minuAhel = null;
System.out.println (minuAhel); // null
minuAhel = new Element ("e1");
System.out.println (minuAhel); // e1;
minuAhel = minuAhel.lisa (null);
System.out.println (minuAhel); // e1;
minuAhel = minuAhel.lisa (new Element ("e0"));
System.out.println (minuAhel); // e0, e1;
minuAhel = minuAhel.lisa (new Element ("e3"));
System.out.println (minuAhel); // e0, e1, e3;
minuAhel = minuAhel.lisa (new Element ("e2"));
System.out.println (minuAhel); // e0, e1, e2, e3;
minuAhel = minuAhel.eemalda (minuAhel.otsi ("e4"));
System.out.println (minuAhel); // e0, e1, e2, e3;
minuAhel = minuAhel.eemalda (minuAhel.otsi ("e0"));
System.out.println (minuAhel); // e1, e2, e3;
minuAhel = minuAhel.eemalda (minuAhel.otsi ("e2"));
System.out.println (minuAhel); // e1, e3;
minuAhel = minuAhel.eemalda (minuAhel.otsi ("e3"));
System.out.println (minuAhel); // e1;
minuAhel = minuAhel.eemalda (minuAhel.otsi ("e1"));
System.out.println (minuAhel); // null
Element teineAhel = new Element ("7");
minuAhel = new Element ("5");
minuAhel = minuAhel.lisa (new Element ("3"));
teineAhel = teineAhel.lisa (new Element ("4"));
Element y = minuAhel.yhilda (teineAhel);
System.out.println (y); // 3 4 5 7
System.out.println (minuAhel); // 3 5
System.out.println (teineAhel); // 4 7
System.out.println ("Lopp"); // Lopp
} // main lopp
} // Element lopp
// faili lopp