/**
 * Luokka <code>MyArray</code> toteuttaa yleiskäyttöisen taulukon,
 * jonka kokoa voi kasvattaa, josta voi hakea alkioita
 * lineaarisella haulla ja puolitushaulla, mikäli taulukko on
 * suuruusjärjestyksessä, ja jonka voi järjestää suuruusjärjestykseen.
 * Tehtävässä 3.4 on tarkoituksena toteuttaa luokan metodit
 * <code>grow</code>, <code>search</code>, <code>binarySearch</code>
 * sekä <code>sort</code>.  */
public class MyArray  {
    private Comparable[] contents;
    
    /**
     * Luo uuden taulukon.
     * @param initialSize Taulukon koko
     */
    public MyArray(int initialSize) {
	contents = new Comparable[initialSize];
    }

    /**
     * Taulukon koon palauttaminen.
     * @return Taulukon koko */
    public int length() {
	return contents.length;
    }

    /**
     * Taulukon tietyn alkion palauttaminen.
     * @param index Mistä taulukon paikasta alkio palautetaan.
     * @return taulukon alkio positiossa <code>index</code>.
     * @exception ArrayIndexOutOfBoundsException Jos annettu indeksi
     * on laiton. */
    public Comparable getElementAt(int index)
	throws ArrayIndexOutOfBoundsException
    {
	/* Huomaa, että poikkeus syntyy
	 * <code>contents</code>-muuttujan käsittelyn yhteydessä ja
	 * tämä metodi ainoastaan välittää sen eteenpäin. */
	return contents[index]; 
    }

    /**
     * Taulukon tietyn alkion asettaminen.
     * @param index Monesko alkio asetetaan.
     * @param value Asetettava arvo
     * @exception ArrayIndexOutOfBoundsException Jos annettu indeksi
     * on laiton. */
    public void setElementAt(int index, Comparable value) 
	throws ArrayIndexOutOfBoundsException
    {
	/* Huomaa, että poikkeus syntyy
	 * <code>contents</code>-muuttujan käsittelyn yhteydessä ja
	 * tämä metodi ainoastaan välittää sen eteenpäin. */
	contents[index] = value;
    }

    /**
     * Kasvatetaan taulukkoa.  Taulukon sisältö säilyy
     * muuttumattomana.
     * @param by Kuinka paljon taulukon kokoa lisätään.
     */
    public void grow(int by) {
      /* Toteuta tämä metodi */
    }

    /**
     * Etsitään lineaarista hakua käyttäen taulukosta tiettyä alkiota.
     * @param value Etsittävä arvo
     * @return pienin indeksi, josta <code>value</code> löytyy tai
     * jokin negatiivinen luku, jos <code>value</code> ei ole
     * taulukossa.
     */
    public int search(Comparable value) { 
      /* Toteuta tämä metodi */
    }

    /**
     * Etsitään puolitushakua käyttäen taulukosta tiettyä alkiota.
     * <b>Huom! Taulukon alkioiden on oltava kasvavassa
     * järjestyksessä, jotta haku on mahdollista.</b>
     * @param value Etsittävä arvo
     * @return pienin indeksi, josta <code>value</code> löytyy tai
     * jokin negatiivinen luku, jos <code>value</code> ei ole
     * taulukossa.
     */
    public int binarySearch(Comparable value) {
      /* Toteuta tämä metodi */
    }

    /**
     * Lajitellaan taulukon alkiot kasvavaan järjestykseen.
     */
    public void sort() {
      /* Toteuta tämä metodi */
    }

    /**
     * Luokan <code>Object</code> metodin uudelleenmääritys.
     */
    public String toString() {
	String result = "[";
	int length = contents.length;
	if (length > 0) {
	    result = result + contents[0];
	}
	for (int i = 1 ; i < contents.length; i++) {
	    result = result + ", " + contents[i];
	}
	result = result + "]";
	return result;
    }

}
