tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
25
ZUGRIFFE
3663
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    Hallo,

    ich möchte ein Suchalgorithmus schreiben.

    Ich bekomm von meinem Eingabefeld z.B. folgenden String:

    "bla blub" or foo moep

    Dieser soll dann folgender maßen umgesetzt werden:

    ( ( x=bla AND x=blub ) OR x=foo ) AND x=moep

    Nur wie muss ich den Sting erlegen !?
    Ich schaff es nicht, dass die " mit dem OR funktionieren
     

  2. #2
    darksmilie darksmilie ist offline Mitglied Gold
    Registriert seit
    Jun 2006
    Ort
    Paderborn
    Beiträge
    243
    Code :
    1
    2
    
    if((x.equals(bla) && x.equals(blub)) || x.equals(moep)){
    }
     

  3. #3
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    ja, die syntax ist mir klar...

    aber ich weiß nicht, wie ich meinen String zerlegen muss, dass ich dann meine abfrage modilieren kann...
     

  4. #4
    darksmilie darksmilie ist offline Mitglied Gold
    Registriert seit
    Jun 2006
    Ort
    Paderborn
    Beiträge
    243
    ich habe es an einer stelle so gemacht:

    allerdings habe ich mein String nur auf einen einzeles Zeichen durchsucht, aber dafür gibt es bestimmt auch eine bessere lösung.

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    for(int i = 0; i < x.length; i++){
                for(int j = 0; j < feld.length(); j++){
                    if(zeichen[i].equals(feld.substring(j,j+1))){
                        ret = false;
                    }
                }
            }

    ps.: schau mal hier rein: http://www.galileocomputing.de/openb....htm#Xxx999382
     

  5. #5
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    Ich glaube, dass ich nicht ganz das war ich suche....

    Im Moment mach ich folgendes:

    String str = "\"bla blub\" or foo moep";
    String[] parm = str.split(" "); // Split mit mein String in ein Array bei einem (Leerzeichen)

    Somit habe ich quasi alle Suchbegriff einzeln im Array...
    nur, wie bekomm ich nun meine Begriffe in mein SQL rein ?

    Ich muss ja prüfen ob ein " " vorhanden ist oder AND bzw. OR ...
     

  6. #6
    javaprogger1987 javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Ich versteh schon was du meinst.. Ich bastel da grad mal was und dann sag ich nochmal Bescheid..
     

  7. #7
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    Vielen Dank schon mal für die Mühe !
     

  8. #8
    javaprogger1987 javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Wie müsste denn im obigen Beispiel der SQL String dann aussehen?
    Hab mich noch nicht soo intensiv mit SQL beschäftigt deswegen..
     

  9. #9
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    [LEFT]SELECT tabelleA.id, tabelleA.text, tabelleC.foo
    FROM tabelleA LEFT JOIN tabelleB ON tabelleA.id = tabelleB.id
    LEFT JOIN tabelleC.id ON tabelleB.id = tabelleC.id

    WHERE ( (LCASE(tabelleA.text) LIKE ‘%bla%’ AND LCASE(tabelleA.text) LIKE ‘%blub%’) OR LCASE(tabelleA.text) LIKE ‘%foo%’ ) AND LCASE(tabelleA.text) LIKE ‘%moep%’

    ORDER BY tabelleA.text

    So sieht mein SQL Befehl aus...
    LCASE ist Lowercase, das die Abfrage nicht CaseSesitiv ist...

    Ich muss das Feld tabelleA.text nach den Suchbegriffen durchsuchen...[/LEFT]
    Geändert von mtk-flo (13.06.06 um 13:58 Uhr)
     

  10. #10
    Freak2k Freak2k ist offline Mitglied Gold
    Registriert seit
    Apr 2005
    Beiträge
    129
    Zitat Zitat von mtk-flo
    Hallo,
    ( ( x=bla AND x=blub ) OR x=foo ) AND x=moep
    selbst wenn du deinen string zerlegst und auf diese weise ueberpruefst, wird er nichts bringen.
    String x
    x kann nicht gleichzeitig "bla" und "blub" sein.
    Ich weiss, dass es nur ein beispiel ist, aber nur zur sicherheit.
    wenn dann solltest du pruefen
    if (x.indexOf("bla") > -1 && x.indexOf("blub") > -1) ...
     

  11. #11
    javaprogger1987 javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Okay.. also hab jetzt mal was gebastelt.. Allerdings ist mir eins noch nicht ganz klar.. Soll der Suchstring von vorne ausgewertet werden? Bsp:

    Von vorne:
    "bla buo blub" or foo or moep blu
    ist gemeint:
    (((bla and buo and blub) or foo) or moep) and blu

    Richtig? Oder wie wäre die Auswertung in diesem Fall gemeint?
    Wenn es so ist hilft dir das vllt:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    
    import java.util.LinkedList;
     
    public class QueryStringFormat
    {
      public static final char CHAR_QUOTE = '"';
      public static final char CHAR_SPACE = ' ';
     
      public QueryStringFormat()
      {
        //Query String
        String qry = "\"bla blub\" or foo moep";
        
        boolean isQuote = false;
        boolean isSpace = false;
        boolean isFirstQuote = true;
     
        int quoteStart = -1;
        int quoteEnd = -1;
     
        LinkedList<int[]> quotes = new LinkedList<int[]>();
        LinkedList<Integer> spaces = new LinkedList<Integer>();
     
        //Die Leerzeichen und Anfuehrungszeichen erkennen
        for ( int i = 0; i < qry.length(); i++ )
        {
          isQuote = false;
          isSpace = false;
     
          switch( qry.charAt( i ) )
          {
            case CHAR_QUOTE: isQuote = true; break;
            case CHAR_SPACE: isSpace = true; break;
          }
     
          if( isQuote && isFirstQuote )
          {
            quoteStart = i;
            isFirstQuote = false;
          }
          else if( isQuote )
          {
            quoteEnd = i;
            isFirstQuote = true;
            quotes.add( new int[]{ quoteStart, quoteEnd } );
          }
     
          if( isSpace )
          {
            spaces.add( i );
            isSpace = false;
          }
        }
     
        StringBuffer qryBuf = new StringBuffer( qry );
     
        //Spaces durch Klammern ersetzen
        for ( int i = 0; i < quotes.size(); i++ )
        {
          int[] actualQuote = quotes.get( i );
          qryBuf.replace( actualQuote[0], actualQuote[0]+1, "(" );
          qryBuf.replace( actualQuote[1], actualQuote[1]+1, ")" );
        }
     
        int c = 0;
        //Spaces die als AND zu werten sind mit " and " ersetzten
        for ( int i = 0; i < spaces.size(); i++ )
        {
          if( isAndSpace( spaces.get( i ) + c*4, qryBuf ) )
          {
            qryBuf.delete( spaces.get( i ) + c*4, spaces.get( i ) + (c*4) + 1 );
            qryBuf.insert( spaces.get( i ) + c*4, " and " );
            c++;
          }
        }
     
        //OR's finden und entsprechend Klammern setzten
        LinkedList<Integer> ORs = new LinkedList<Integer>();
        int actualOrOffset = -2;
     
        while( ( actualOrOffset = qryBuf.indexOf( " or ", actualOrOffset + 2 ) ) > -1 )
        {
          int startFirstTag = getStartOfTag( actualOrOffset, qryBuf );
          int endSecondTag = getEndOfTag( actualOrOffset, qryBuf );
     
          qryBuf.insert( startFirstTag, "(" );
          qryBuf.insert( endSecondTag, ")" );
        }
     
        System.out.println( qry );
        System.out.println( qryBuf.toString() );
     
      }
     
      private int getStartOfTag( int offset, StringBuffer buf )
      {
     
        if( buf.charAt( offset - 1 ) != ')' )
        {
          for ( int i = offset - 1; i >= 0; i-- )
          {
            if( buf.charAt( i ) == ' ' )
              return i;
          }
          return 0;
        }
        else
        {
          for ( int i = offset - 1; i >= 0; i-- )
          {
            if ( buf.charAt( i ) == '(' )
              return i;
          }
          return 0;
        }
      }
     
      private int getEndOfTag( int offset, StringBuffer buf )
      {
        if( buf.charAt( offset + 4 ) != '(' )
        {
          for ( int i = offset + 4; i < buf.length(); i++ )
          {
            if( buf.charAt( i ) == ' ' )
              return i + 1;
          }
          return 0;
        }
        else
        {
          for ( int i = offset + 4; i < buf.length(); i++ )
          {
            if ( buf.charAt( i ) == ')' )
              return i + 1;
          }
          return 0;
        }
      }
     
      private boolean isAndSpace( int offset, StringBuffer qry )
      {
        String before = "";
        String behind = "";
     
        if( offset > 1 && ( offset + 2 ) < qry.length() )
        {
          before = qry.substring( offset - 2, offset );
          behind = qry.substring( offset + 1, offset + 3 );
        }
        else if( offset > 1 )
        {
          before = qry.substring( offset - 2, offset );
        }
        else
        {
          behind = qry.substring( offset + 1, offset + 3 );
        }
     
        if( before.equals( "or" ) || behind.equals( "or" ) )
          return false;
     
        return true;
      }
     
      public static void main( String[] args ) {
        QueryStringFormat qry = new QueryStringFormat();
      }
    }

    Danach müsstest du nur noch die einzelnen Suchbegriffe mit den entsprechenden Sql Tags ersetzten..
    Bsp: bla -> (LCASE(tabelleA.text) LIKE ‘%bla%’
    Geändert von javaprogger1987 (13.06.06 um 14:44 Uhr)
     

  12. #12
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    Von der Logik her stimmt das.
    Vielen Dank schon mal

    Ich bekomm aber noch ein Fehler:

    "The Type LinkedList is not generic; it cannot be parameterized with arguments <Integer>"
    bzw.
    "The Type LinkedList is not generic; it cannot be parameterized with arguments <int[]>"
    Geändert von mtk-flo (14.06.06 um 10:33 Uhr)
     

  13. #13
    javaprogger1987 javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Hmm.. Hast du Java 5 und Generics aktiviert?
    Ansonsten kannst du die Version nehmen - ohne Generics..
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    
    import java.util.LinkedList;
     
    public class QueryStringFormat
    {
      public static final char CHAR_QUOTE = '"';
      public static final char CHAR_SPACE = ' ';
     
      public QueryStringFormat()
      {
        //Query String
        String qry = "\"bla blub\" or foo moep";
     
        boolean isQuote = false;
        boolean isSpace = false;
        boolean isFirstQuote = true;
     
        int quoteStart = -1;
        int quoteEnd = -1;
     
        LinkedList quotes = new LinkedList();
        LinkedList spaces = new LinkedList();
     
        //Die Leerzeichen und Anfuehrungszeichen erkennen
        for ( int i = 0; i < qry.length(); i++ )
        {
          isQuote = false;
          isSpace = false;
     
          switch( qry.charAt( i ) )
          {
            case CHAR_QUOTE: isQuote = true; break;
            case CHAR_SPACE: isSpace = true; break;
          }
     
          if( isQuote && isFirstQuote )
          {
            quoteStart = i;
            isFirstQuote = false;
          }
          else if( isQuote )
          {
            quoteEnd = i;
            isFirstQuote = true;
            quotes.add( new int[]{ quoteStart, quoteEnd } );
          }
     
          if( isSpace )
          {
            spaces.add( i );
            isSpace = false;
          }
        }
     
        StringBuffer qryBuf = new StringBuffer( qry );
     
        //Spaces durch Klammern ersetzen
        for ( int i = 0; i < quotes.size(); i++ )
        {
          int[] actualQuote = (int[]) quotes.get( i );
          qryBuf.replace( actualQuote[0], actualQuote[0]+1, "(" );
          qryBuf.replace( actualQuote[1], actualQuote[1]+1, ")" );
        }
     
        int c = 0;
        //Spaces die als AND zu werten sind mit " and " ersetzten
        for ( int i = 0; i < spaces.size(); i++ )
        {
          if( isAndSpace( (Integer)spaces.get( i ) + c*4, qryBuf ) )
          {
            qryBuf.delete( (Integer)spaces.get( i ) + c*4, (Integer)spaces.get( i ) + (c*4) + 1 );
            qryBuf.insert( (Integer)spaces.get( i ) + c*4, " and " );
            c++;
          }
        }
     
        //OR's finden und entsprechend Klammern setzten
        int actualOrOffset = -2;
     
        while( ( actualOrOffset = qryBuf.indexOf( " or ", actualOrOffset + 2 ) ) > -1 )
        {
          int startFirstTag = getStartOfTag( actualOrOffset, qryBuf );
          int endSecondTag = getEndOfTag( actualOrOffset, qryBuf );
     
          qryBuf.insert( startFirstTag, "(" );
          qryBuf.insert( endSecondTag, ")" );
        }
     
        System.out.println( qry );
        System.out.println( qryBuf.toString() );
     
      }
     
      private int getStartOfTag( int offset, StringBuffer buf )
      {
     
        if( buf.charAt( offset - 1 ) != ')' )
        {
          for ( int i = offset - 1; i >= 0; i-- )
          {
            if( buf.charAt( i ) == ' ' )
              return i;
          }
          return 0;
        }
        else
        {
          for ( int i = offset - 1; i >= 0; i-- )
          {
            if ( buf.charAt( i ) == '(' )
              return i;
          }
          return 0;
        }
      }
     
      private int getEndOfTag( int offset, StringBuffer buf )
      {
        if( buf.charAt( offset + 4 ) != '(' )
        {
          for ( int i = offset + 4; i < buf.length(); i++ )
          {
            if( buf.charAt( i ) == ' ' )
              return i + 1;
          }
          return 0;
        }
        else
        {
          for ( int i = offset + 4; i < buf.length(); i++ )
          {
            if ( buf.charAt( i ) == ')' )
              return i + 1;
          }
          return 0;
        }
      }
     
      private boolean isAndSpace( int offset, StringBuffer qry )
      {
        String before = "";
        String behind = "";
     
        if( offset > 1 && ( offset + 2 ) < qry.length() )
        {
          before = qry.substring( offset - 2, offset );
          behind = qry.substring( offset + 1, offset + 3 );
        }
        else if( offset > 1 )
        {
          before = qry.substring( offset - 2, offset );
        }
        else
        {
          behind = qry.substring( offset + 1, offset + 3 );
        }
     
        if( before.equals( "or" ) || behind.equals( "or" ) )
          return false;
     
        return true;
      }
     
      public static void main( String[] args ) {
        QueryStringFormat qry = new QueryStringFormat();
      }
    }

    Gruß
    Tobias
     

  14. #14
    Avatar von mtk-flo
    mtk-flo mtk-flo ist offline Mitglied Gold
    Registriert seit
    Jan 2005
    Ort
    Hessen
    Beiträge
    192
    Vielen Dank für deine Mühe, aber ich bekomm es nicht zum laufen....

    Ich bekomm eine "java.lang.UnsupportedClassVersionError" Meldung, wenn ich es starten will :/

    Damit kann ich leider nix anfangen.
    Was muss ich umstellen ?!

    Ich arbeite mit Eclispse, wenn das ein unterschied ist.
     

  15. #15
    javaprogger1987 javaprogger1987 ist offline Mitglied Brokat
    Registriert seit
    Nov 2004
    Beiträge
    284
    Ja isses denn wahr
    Welche Java Version verwendest du denn? Bei mir läufts sowohl unter Java 5(1.5) als auch unter 1.4.2 ohne Probleme..

    Gruß
    Tobias
     

Ähnliche Themen

  1. Suchalgorithmus
    Von wert im Forum Coders Talk
    Antworten: 7
    Letzter Beitrag: 04.03.10, 15:04
  2. Suchalgorithmus für Zahlenreihen
    Von philBerlin im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 2
    Letzter Beitrag: 20.09.07, 16:17
  3. Suchalgorithmus um Datenbank zu durchsuchen
    Von SeeSharpNewBee im Forum Java
    Antworten: 2
    Letzter Beitrag: 01.06.07, 12:41
  4. Mein Suchalgorithmus funktoniert nicht
    Von MinaM im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 6
    Letzter Beitrag: 22.08.05, 15:07
  5. suchalgorithmus
    Von fabr im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 17.03.04, 16:53