Kann methode aus anderer Klasse nicht aufrufen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!
Ich habe binarySearch mit einer Rekursiven funktion nachprogrammiert. Aber ich kann jetzt in meiner Testklasse eine Methode nicht aufrufen...hier mal der Code:

Testklasse:
Code:
/*
 * Das ist die Testklasse zu Searcher.java
 *
 * @author Manuel
 * @version 11.11.2005
 */
public class Testklasse {
    public static void main(String args[]){
        int test[] = new int[20];
        
        for(int i = 0, z = 1; i < 20; i++, z++){
            test[i] = z;
        }
        
        Searcher zahlenSuche = new Searcher(test, true);
        System.out.println(zahlenSuche.binarySearch(0));
    }
    
}
Hier zeigt er mir an "Cannot find Symbol":
Code:
System.out.println(zahlenSuche.binarySearch(0));

und hier ist die Klasse zu der Testklasse:
Code:
import java.util.*;
/*
 * Es gibt ein Array, in dem nach einer bestimmten Zahl gesucht werden soll. Die
 * Suche erfolgt durch ständiges Halbieren. Man prüft in welcher Hälfte des Arrays
 * sich die Zahl befindet danach halbiert man diese Hälfte nocheinmal und prüft
 * wieder in welcher Hälfte sich die Zahl befindet usw... bis man die Zahl findet.
 * Wenn die Zahl nicht gefunden wird soll -1 ausgegeben werden.
 * @author Manuel
 * @version 11.11.2005
 */
public class Searcher
{
    private int [] array;

    /** 
     * Das Array wird initialisiert und bei Bedarf wird das Array auch sortiert
     * @param   int [] a    Zum initialisieren des Arrays
     * @param   sort        Falls sort true ist wird das Array sortiert
     */
    public Searcher(int [] a, boolean sort)
    {
        array = a;
        if (sort){
           Arrays.sort(a);
        }
    }
    /**
     * Diese Methode sucht nach einer int Zahl in einem Array. Es wird zuerst verglichen
     * ob diese Zahl exakt die Mitte ist, wenn nicht dann wird überprüft in welcher
     * Hälfte weitergesucht werden soll.
     *
     * @param  untereSchranke    Der untere Bereich des Arrays, die untere Schranke
     * @param  obereSchranke     Der obere Bereich des Arrays, die obere Schranke
     * @param  gesuchteZahl      Die Zahl die zu suchen ist
     * @return                   Entweder der Index der gesuchten Zahl und falls diese nicht vorkommt -1
     */
    public int binary(int untereSchranke, int obereSchranke, int gesuchteZahl)
    {
        double mitte = array[(obereSchranke + untereSchranke)/2];
        
        if(mitte == gesuchteZahl){
            return (obereSchranke + untereSchranke)/2;
        }
        
        if(mitte < gesuchteZahl && array[array.length-1] >= gesuchteZahl){
            return binary((obereSchranke + untereSchranke)/2+1, array[array.length-1], gesuchteZahl);
        }
        
        if(mitte > gesuchteZahl && array[0] <= gesuchteZahl){
            return binary(array[0], (obereSchranke + untereSchranke)/2-1, gesuchteZahl);   
        }
        else{
            return -1;
        }
    }
    /**
     * Diese Methode ruft die Methode binary auf und gibt die Gesuchte Zahl aus oder
     * falls diese nicht im Array enthalten ist -1
     * @param gesuchteZahl   Die gesuchte Zahl des Arrays
     * @return               Index nachdem gesucht wurde.
     */
    public int binarySearch(int gesuchteZahl){
        return binary(0, array.length-1, gesuchteZahl);
    }
}
[/code]
 
Sind die Dateien im gleichem package ? im gleichem/richtigem Verzeichnis ?

Arbeitest Du mit einer IDE oder nutzt du händich den javac ? falls ja: übersetzt mal zuerst die Searcher und dann deine TestKlasse
 
So, das erste Problem habe ich mittlerweile gelöst. Aber jetzt habe ich noch eines.
Wenn ich der Testklasse nach mehreren Werten suche wie hier z.B.:
Code:
/* 
* Das ist die Testklasse zu Searcher.java 
* 
* @author Manuel 
* @version 11.11.2005 
*/ 
public class Testklasse { 
    public static void main(String args[]){ 
        int test[] = new int[20]; 
        
        for(int i = 0, z = 1; i < 20; i++, z++){ 
            test[i] = z; 
        } 
        
        Searcher zahlenSuche = new Searcher(test, true); 
        System.out.println(zahlenSuche.binarySearch(0)); 
    } 
    
}

Da bekomme ich immer eine Fehlermeldung: java.lang.StackOverflowError
Meine Frage ist nun was muss ich in der anderen Klasse (also nicht in der Testklasse) verändern damit statt Stack.OverflowError die Zahl -1 returnt wird und nicht der Fehler....
 
wo suchst du den hier nach mehrern werten? ???:L
Code:
/*
* Das ist die Testklasse zu Searcher.java
*
* @author Manuel
* @version 11.11.2005
*/
public class Testklasse {
    public static void main(String args[]){
        int test[] = new int[20];
       
        for(int i = 0, z = 1; i < 20; i++, z++){ // hier fehlt ein int (int z = 1)
            test[i] = z;
        }
       
        Searcher zahlenSuche = new Searcher(test, true);
        System.out.println(zahlenSuche.binarySearch(0));
    }
   
}
 
Bleiglanz hat gesagt.:
musst halt schauen, dass deine Rekursion wirklich abbricht, Fehler ist in Methode binary(...)

das weiss ich auch Bleiglanz. Ich habe es jetzt so gelöst indem ich vorher eine Variable auf -1 gesetzt habe und diese in der Methode binary immer um 1 erhöht wird (zaehler++) und falls zaehler > als array.length/2 ist dann soll er -1 returnen.

Hat jemand ne bessere Lösung?
 
rekursiv ? sicher dass du immer den gleichen counter behältst?

zeig mal den code von binary....


nur so nebenbei: die Klasse Arrays hat schon eine binäre Suche implementiert
 
nur so nebenbei: die Klasse Arrays hat schon eine binäre Suche implementiert
Ich weis, das war aber unsere Aufgabe in der Schule bis morgen...*gg*

Hier ist die aktuelle Methode binary:
Code:
//ich habe vorher die Variable overflow auf -1 gesetzt.

public int binary(int untereSchranke, int obereSchranke, int gesuchteZahl)
    {
        overflow++;
        double mitte = array[(obereSchranke + untereSchranke)/2];
        
        if(overflow > array.length/2){
            return -1;
        }
        if(mitte == gesuchteZahl){
            return (obereSchranke + untereSchranke)/2;
        }
        
        if(mitte < gesuchteZahl && array[array.length-1] >= gesuchteZahl){
            return binary((obereSchranke + untereSchranke)/2+1, array[array.length-1], gesuchteZahl);
        }
        
        if(mitte > gesuchteZahl && array[0] <= gesuchteZahl){
            return binary(array[0], (obereSchranke + untereSchranke)/2-1, gesuchteZahl);   
        }
        else{
            return -1;
        }
    }
[/code]
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben