ERLEDIGT
JA
JA
ANTWORTEN
25
25
ZUGRIFFE
3663
3663
EMPFEHLEN
-
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
-
13.06.06 11:19 #2
- Registriert seit
- Jun 2006
- Ort
- Paderborn
- Beiträge
- 243
Code :1 2
if((x.equals(bla) && x.equals(blub)) || x.equals(moep)){ }
-
ja, die syntax ist mir klar...
aber ich weiß nicht, wie ich meinen String zerlegen muss, dass ich dann meine abfrage modilieren kann...
-
13.06.06 12:41 #4
- 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
-
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 ...
-
13.06.06 13:12 #6
- 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..
-
Vielen Dank schon mal für die Mühe !
-
13.06.06 13:41 #8
- 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..
-
[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)
-
selbst wenn du deinen string zerlegst und auf diese weise ueberpruefst, wird er nichts bringen.
Zitat von mtk-flo
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) ...
-
13.06.06 14:31 #11
- 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)
-
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)
-
14.06.06 13:10 #13
- 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
-
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.
-
14.06.06 17:14 #15
- 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
-
Suchalgorithmus
Von wert im Forum Coders TalkAntworten: 7Letzter Beitrag: 04.03.10, 15:04 -
Suchalgorithmus für Zahlenreihen
Von philBerlin im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 2Letzter Beitrag: 20.09.07, 16:17 -
Suchalgorithmus um Datenbank zu durchsuchen
Von SeeSharpNewBee im Forum JavaAntworten: 2Letzter Beitrag: 01.06.07, 12:41 -
Mein Suchalgorithmus funktoniert nicht
Von MinaM im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 6Letzter Beitrag: 22.08.05, 15:07 -
suchalgorithmus
Von fabr im Forum Delphi, Kylix, PascalAntworten: 1Letzter Beitrag: 17.03.04, 16:53





Zitieren
Login





