Java String Array

Nanotic

Lieutenant
Registriert
Sep. 2010
Beiträge
560
Hallo liebe Communtiy,

habe folgendes Problem:

ich möchte ein Array durchsuchen lassen, welches Strings enthält, jedoch nur mit der Binären Suche!!!

Bisher sieht es wie folgt aus :

Code:
public class StringSuche
   {
          public static void main(String args[])
          {                                  
                         System.out.println("Wie viele Werte möchten Sie eingeben?");

                         int anzahl = Tastatur.intInput();

                         String [] Array = new String [anzahl+1]; 

                            for (int i = 0; i< anzahl; i++ ) 
                            {
                                 Array[i]= Tastatur.stringInput();
                             } // end of for

                         int mitte, links = 0, rechts = (anzahl-1), index = 0;

                         System.out.println("Welchen Wert wollen Sie suchen?");

    
                         String wert = Tastatur.stringInput();

    
                         while (links <= rechts) 

                          { 
                        
                         mitte = Math.round((links+rechts)/2);
      
                                     if (Array[mitte]== wert) 
                                     {
                                           index = mitte;
                                           break;
                                     } // end of if
      

                                     if (Array[mitte]> wert) 
                                     {
                                           rechts = mitte -1;
                                     
                                      } // end of if
      

                                      if (Array[mitte]< wert) 
                                      {
                                             links = mitte+1;
                                     
                                       } // end of if        
                                  

                                   } // end of while 
    
                  if (links <= rechts ) 
                  {
                       System.out.println("Wort gefunden, Index: "+index);
   
                   } // end of if
    
                 else {
                       System.out.println("Wort existiert nicht!");
     
                         } // end of if-else
           }
  
}


Das Problem ist: Bei dem if wird ja verglichen, jedoch ist das eher was für Zahlen. Wie bekomme ich es hin, dass das Programm mir sagt an welcher Stelle ein Wort steht?
 
Zuletzt bearbeitet:
dein input ist sortiert? das benötigst du nämlich für eine binäre suche.

ansonsten sieht das nach code für binäre suche auf sortierten zahlen aus, den du auf strings ändern möchtest.

du kannst die eine ordnung auf strings definieren (z.b. lexikographisch) und damit dann die vergleiche machen. aber wie gesagt, der input muss dann in dieser reihenfolge eingegeben werden.
 
du vergleichst strings, also solltest du auch equals benutzen und nicht == . bist du dir sicher, dass man >, < auch bei strings nutzen kann? wenn nicht prüfe auf anfangsbuchstaben.

desweiteren ist es nicht gerade ne gute methode, ne methode für zahlen auf strings einfach 1:1 umzubiegen
 
Es war für Integer-Werte gedacht. Mein Lehrer hat mir aber vorgeschlagen, es mal mit Strings zu probieren.

CompareTo hatten wir schonmal.
 
Ich schließe mich den oberen an: compareTo sollte deine Probleme lösen.


P.S. achte bitte auf die Java Konventionen:

Variablennamen werden klein geschrieben (Klassennamen groß):
String [] Array = new String [anzahl+1];
sollte also so aussehen:
String [] array = new String [anzahl+1];
 
Habe mich eben noch mal dran gesetzt und bin so weit gekommen:

Code:
public class BinaereSucheString
{
  public static void main(String args[])
  {                                  
    boolean wiederholung = true;
    do { 
      System.out.println("Wie viele Wörter wollen Sie eingeben?");
      int anzahl = Tastatur.intInput(), temp;
      String [] array = new String [anzahl];
      for (int i = 0; i< anzahl; i++ ) 
      {
        System.out.println("Geben Sie jetzt das "+(i+1)+". Wort ein!");
        System.out.println("\n-------------------------------\n");
        array[i]= Tastatur.stringInput();
        System.out.println("\n-------------------------------\n");
      } // end of for
      int mitte, links = 0, rechts = (anzahl-1), index = 0;
      System.out.println("Welches Wort wollen Sie suchen?");
      
      String wert = Tastatur.stringInput(), Ja = "Ja", Nein = "Nein", vari;
      
      while (links <= rechts) 
      { 
        mitte = Math.round((links+rechts)/2);
        
        temp = array[mitte].compareTo(wert);
        
        if (temp == 0) 
        {
          index = mitte;
          break;
        } // end of if
        
        if (temp>0) 
        {
          rechts = mitte -1;
        } // end of if
        
        if (temp< 0) 
        {
          links = mitte+1;
        } // end of if        
      } // end of while
      
      if (links <= rechts ) 
      {
        System.out.println("Wort gefunden, Index: "+index);
      } // end of if
      
      else {
        System.out.println("Wort existiert nicht!");
      } // end of if-else
      System.out.println("Den Vorgang wiederholen?");
      
      System.out.println("Wenn ja, geben sie 'Ja ein oder 'Nein' wenn nicht");
      
      
      vari = Tastatur.stringInput();
      if (vari == Ja) {
        wiederholung = true;
      } // end of if
      if (vari == Nein) 
      {
        wiederholung = false;
      } // end of if
    } while (wiederholung == true );
    
  }
  
}


Meine Probleme:

1.Wenn ich 5 Wörter eingebe und das 5. Wort eingebe findet er es nicht.
2. Wenn ich "Nein" eingebe macht er trotzdem weiter, obwohl ich ja das if benutze?!
 
2. equals hatten wir bisher nicht. Also möchte ich es ohne hinbekommen. Geht das?
 
equals macht genau das, was du brauchst. alternativ kannst du wie weiter oben compareTo verwenden und auf 0 testen, intern passiert dasselbe.

== überprüft nicht, ob in den beiden strings dasselbe drinsteht, sondern ob es sich um dasselbe string-objekt handelt.
 
Zuletzt bearbeitet:
NewNewNewBee schrieb:
2. equals hatten wir bisher nicht. Also möchte ich es ohne hinbekommen. Geht das?

Ein kleines Beispiel:
Code:
		String test = new String("");
		String test1 = new String("");
		
		System.out.println(test == test1); // false
		System.out.println(test.equals(test)); // true
		System.out.println(test1 == test); // false
		System.out.println(test.equals(test1)); // true

Werden die Strings einfach mit

Code:
                String test = "";
                String test1 = "";

		System.out.println(test == test1); // true
		System.out.println(test.equals(test)); // true
		System.out.println(test1 == test); // true
		System.out.println(test.equals(test1)); // true

angelegt, sind wieder alle Ergebnisse "True".
 
Zuletzt bearbeitet:
Dein zweites Beispiel könnte aber einen Anfänger täuschen und klappt auch nur so wie von dir demonstriert (Strings zur Kompilierzeit bekannt). Besser immer "equals" nutzen bei Strings, wenn es wirklich um den Inhalt gehen soll.
 
Zuletzt bearbeitet:
Habe es jetzt hinbekommen.

Jedoch möchte ich abfragen lassen, ob der ganze Vorgang wiederholt werden soll, oder nicht.

Habe bereits diesen Ansatz:

Code:
public class StringVergleich
{
  public static void main(String egal[])
  {
    boolean wiederholung = true;
    do { 
      
      String wort = Tastatur.stringInput(), Ja = "Ja", Nein = "Nein", vari;
      
      System.out.print("Den Vorgang wiederholen? ");
      System.out.println("Wenn Ja geben sie 'Ja' ein, wenn nicht 'Nein'.");
      vari = Tastatur.stringInput();
      if (vari == Nein) {
        wiederholung = false;
      } // end of if
      if (vari == Ja) 
      {
        wiederholung = true;
        } // end of if
    } while (wiederholung != false );
    
    
  }
  
}
Ergänzung ()

OK hat sich erledigt :D Habe es wieder mit equals gemacht.. :D
 
Du hast noch eine etwas umständliche Vorgehensweise. Aber das renkt sich mit der Zeit schon noch ein.

Code:
if (vari == Ja) 
{
   wiederholung = true;
} // end of if

kannst du dir sparen. Du setzt es doch vor der Schleife schon auf true. Du könntest dir sogar die ganze Variable sparen, wenn du sowas machen würdest
Code:
while (true) {
   ...
   if ("nein".equalsIgnoreCase(vari)) {
      break;
   }
}
Damit ist ganz klar erkennbar an welchen Stellen die Schleife abbricht und man muss nicht erst hier und da nachsehen, wo die Variable geschrieben wird (und vielleicht durch fehlerhaften Code ungewollt mehrfach überschrieben wird).
 
@Tumbleweed: Eigentlich ist durch die Verwendung von break eben nicht klar zu sehen, wann die Schleife beendet wird...

Und wenn er schon Variablen nutzt für den Vergleich, was begrüßenswert ist, könnte man sie wenigstens durch symbolische statt numerische Konstanten ersetzen...

Code:
public class StringVergleich
{
  private final String END = "nein";

  public static void main(String egal[])
  {
    String input = "";
    while (!END.equals(input)) {
      String wort = Tastatur.stringInput();
      System.out.print("Den Vorgang wiederholen ('" + END + "' zum Beenden)? ");
      input = Tastatur.stringInput();
    }
  }
  
}
 
Zurück
Oben