Java Werte aus einem String in Liste Speichern?
Hey!
Ich würde gerne aus dem bsp String s = "SELECT* FROM kunde, chef, laden" das die werte kunde, chef und laden jeweils einzeln in einer liste abgespeichert werden.
Da der String s jederzeit geändert werden kann ist es wichtig, dass sich die Liste in der länge anpasst (in dem falle größe von 3, wenn dort noch ", haus" stehen würde müsste die liste die länge vier haben.
Wichtig ist, dass nur die worte ohne komma gespeichert werden.
Kann mir jemand erklären wie ich das mache bzw. eine Beispiel Methode schreiben?
Vielen Dank!
LG
3 Antworten
Splitte erst in zwei Teile (Trenner ist FROM) und anschließend vom zweiten Teil noch einmal anhand von Komma und Leerzeichen. Via Stream können leere Einträge herausgefiltert werden.
String[] result = Arrays.stream(s.split("FROM")[1].split("[\\s,]")).filter(e -> e.length() > 0).toArray(String[]::new);
Wenn man das obige Snippet lediglich erweitert:
String[] result = s.split("(?i)from")[0].split("(?i)select\\s*")[1].split("[\\s,]+");
Andererseits könnte man den Substring zwischen SELECT und FROM auch direkt mit einem Matcher herausziehen.
Pattern regex = Pattern.compile("(?i)select\\s+(.+)\\s+from");
Matcher matcher = regex.matcher(s);
if (matcher.find()) {
String columns = matcher.group(1);
// split column list ...
}
Oder du suchst erst mit der indexOf-Methode nach dem Index, wann from beginnt und zerlegst den String dann mit Hilfe der substring-Methode.
//add to the end of the list
stringList.add(random);
//add to the beginning of the list
stringList.add(0, random);
//replace the element at index 4 with random
stringList.set(4, random);
//remove the element at index 5
stringList.remove(5);
//remove all elements from the list
stringList.clear();
Noch irgendwas unklar? Listen lohnen sich allerdings nur bei einer stark eingeschränkten Größe. 100 Tupel sind in Ordnung, aber ab 1000 wird es dann echt langsam!
...........................
Dort kannst du nun entweder den gesamten String der Datenbankanfrage speichern, oder du zersplitterst den String bereits und nutzt eine Containervariante, wo du dann ein Array hinterlegen kannst.
also ich würde erstmal den String so kürzen das das Select ... FROM weg ist
den rest kann man dann mit Split und dem trennzeichen Komma aufteilen .
z.b.
public class Main {
public static void main(String[] args) {
String str = "select * FROM kunde,chef,laden ";
String strlast = str.substring(15); // oder was vergleichbares was das FROM ende findet
String[] words = strlast.split(",");
for (String word : words) {
System.out.println(word);
}
}
}
aber wenn es um SQL statements geht, dann würde ich die entsprechenden felder aus der antwort vom server holen .
Danke! Es geht in dem Falle darum die Wartbarkeit zu garantieren, dass andere Entwickler in der Config Datei alles simple einstellen können. :)
oder die Regexes so anpassen, dass gar keine leeren Einträge entstehen:
(Das "(?i)" bedeutet nur case-insensitive, also dass das "FROM" groß oder klein oder gemischt geschrieben werden kann)