wenn ich zB aus dem String "package.class" den string "class" machen will,
d.h. ich suche nach dem Zeichen "." und schneide alles davor inklusive ab per zB substring.
wie mach ich das am schlauesten?
Das irgendwie zum Array machen und dann durchlaufen?
Oder eine Art Scanner dafür, oder sogar mit Pattern/Matcher oder regex?
Oder hat String dafür selber schon was? Weil irgendwie weiss ich jetzt gar nicht wie ich das angehen soll,
ohne es echt recht umständlich zu tun...
Mit der Methode String#indexOf bekommst du die Position deines "Punktes". Und dann kannst du über substring (wie du schon erkannt hast) den String auch beschneiden.
Alternative kannst du auch mit einem regex alles auslesen, was nach dem ersten Punkt kommt. Oder über "package.class".split("\\.")[1]; Die Hälfte nach dem Punkt auslesen.
aber ich muss noch mal auf etwas zurückkommen, ich hab grad ein problem wie ich das angehen soll.
es ist so, dass ich zur Laufzeit Log-Nachrichten adde, und die formatier ich beim adden gleich um,
d.h. ich ruf dort gleich mal stacktraceelement auf um dann aus einer nachricht sowas zu machen wie:
So, jetzt hab ich das eben erst als String der ArrayList<String> als Nachricht geaddet.
Wenn ich mir jetz aber den kompletten Log mit allen Nachrichten ausgeben lassen will, wird das unglaublich kompliziert.
Denn ich müsste für jede Log-Nachricht testen, wie lang zB der Teilstring "@Main:MethodeWoAddAufgerufenWird (Zeile)" ist, und dann bis zum "> Nachricht" einen bestimmten Abstand hinzufügen, zB mit Hilfe einer finalen festen Variable, sagen wir mal 50. Und dann füge ich halt solange Leerzeichen rein, bis es 50 sind, und dann kommt die Nachricht.
Ich meine...das ist doch mal ziemlich schlecht gecodet dann, weil ich erstelle mir den formatierten String ja schon beim adden, und müsste dann beim ausgeben des Logs die ganzen Strings sowieso wieder auseinander nehmen und neu basteln...
Problem ist zur Laufzeit, dass ich ja nicht wissen kann welches die längste Nachricht von allen sein wird, wenn der Log ausgedruckt werden soll.
Ich hatte es jetzt mit einer Map versucht:
Code:
Map <String,Integer> = new HashMap<String,Integer>()
und da wird dann gleich beim adden der Nachricht auch noch die Länge geaddet, so dass ich am Schluss das nur noch ausgeben muss.
Aber das war wohl nicht überdacht, denn ich kann mir ja nur <Integer> von jeder Nachricht ausgeben, aber den String selber nicht mehr, der ist dann quasi verloren ??? Ich meine mit get() krieg ich nur den Integer, aber nicht mehr den String..
Wie soll ich das denn jetzt machen, ohne dass es total bescheuert programmiert ist?
Ich dachte mir jetzt halt mein Gott zwei ArrayListen, eine <String> und eine <Integer>, und beim adden von Nachrichten
fütter ich die parallel, die eine mit der Nachricht, die andere mit der Länge.
Und beim ausgeben greife ich jeweils auf das i-te Element zu, weil der 4.Längeneintrag zB gehört zur 4.Nachricht.
Aber ist das guter Programmierstil, ich glaube nicht?
Was wär euer Vorschlag, wie würdet ihr das alles implementieren?
Nochmal: Ich adde zur Laufzeit Nachrichten. Beim Ausgeben soll eine schöne Tabelle enstehen wo eben
zu jeder Nachricht auf die Zeit, als sie geaddet wurde, die Methode von der sie stammt etc angezeigt wird,
schön untereinander gegliedert..
class NachrichtUndLaenge{
private String nachricht;
private int laenge;
public NacrichtUndLaenge(String nachricht, int laenge){
this.nachricht = nachricht;
this.laenge = laenge;
}
public String getNachricht(){
return nachricht;
}
public int getLaenge(){
return laenge;
}
}
Code:
List<NachrichtUndLaenge> log = new ArrayList<NachrichtUndLaenge>();
log.add(new NachrichtUndLaenge("blubb",5);
log.get(0).getLaenge();