package Model;


/**
 * F&uuml;hrt die gew&uuml;nschten Laufzeittests durch.
 * 
 * @author ISB-Arbeitskreis, Umsetzungshilfen Informatik 12
 * @version 1.0
 */

import java. util. *;

public class TESTSUCHE
{
    /* Anzahl der Datenelemente in Liste und / oder Baum */
    private int anzahl;
    /* Die zu testende Lsite */
    private Model. Liste. LISTE l;
    /* Der zu testende Baum */
    private Model. Baum. BAUM b;
    /* Erzeugerelement f&uuml;r die Schl&uuml;sselwerte */
    private GENERATOR g;
    /* Der Zufallsgeneratur f&uuml;r die Auswahl der zu suchenden Werte */
    private Random zufall;
    /* Die Vergleichsanzahlen */
    private int anzahl1, anzahl2;
    /* Die vorhandenen Datenelemente */
    private ArrayList<DATENELEMENT> schluesselwerte;

    /**
     * Legt die ben&ouml;tigten Objekte an und besetzt die Attributwerte.
     * @param anzahl Anzahl der Datenelemente in Liste und / oder Baum
     */
    public TESTSUCHE (int anzahl)
    {
        this. anzahl = anzahl;
        zufall = new Random ();
        l = new Model. Liste. LISTE ();
        b = new Model. Baum. BAUM ();
        g = new GENERATOR (10);
        schluesselwerte = new ArrayList<DATENELEMENT> ();
        for (int i = 1; i <= anzahl; i++)
        {
            schluesselwerte. add (new STRINGDATEN (g. BezeichnerGenerieren ()));
        }
    }
    
    /**
     * Zu suchendes Testelement ausw&auml;hlen.
     * @return Testelement
     */
    private DATENELEMENT TestWaehlen ()
    {
        return schluesselwerte. get (zufall. nextInt (anzahl));
    }
    
    /**
     * Bestimmt die durschnittlichen Vergleichszahlen f&uum;r die Suche.
     * @param anzahl Anzahl der auszuf&uuml;hrenden Suchvorg&auml;nge
     * @param liste gibt an, ob in der Liste gesucht werden soll
     * @param baum gibt an, ob im Baum gesucht werden soll
     */
    public void DurchschnittsTest (int anzahl, boolean liste, boolean baum)
    {
        for (DATENELEMENT d: schluesselwerte)
        {
            if (liste)
            {
                l. Einfuegen (d);
            }
            if (baum)
            {
                b. Einfuegen (d);
            }
        }
        anzahl1 = 0;
        anzahl2 = 0;
        for (int i = 1; i <= anzahl; i++)
        {
            DATENELEMENT d;
            d = TestWaehlen ();
            if (liste)
            {
                l. Suchen (d);
                anzahl1 += l. ZaehlerGeben ();
            }
            if (baum)
            {
                b. Suchen (d);
                anzahl2 += b. ZaehlerGeben ();
            }
        }
        anzahl1 /= anzahl;
        anzahl2 /= anzahl;
    }
    
    /**
     * Meldet die durchschnittliche Anzahl der Vergleiche f&uuml;r die Suche in der Liste.
     * @return Suchzeit
     */
    public int AnzahlFuerListensucheGeben ()
    {
        return anzahl1;
    }
    
    /**
     * Meldet die durchschnittliche Anzahl der Vergleiche f&uuml;r die Suche im Baum.
     * @return Suchzeit
     */
    public int AnzahlFuerBaumsucheGeben ()
    {
        return anzahl2;
    }
}
