Ich bin gerad dabei eine Funktion zu schreiben, die aus einem gelieferten Text alle in einer HashMap<String Key, String Value> ersetzten soll. Die Funktion soll folgenden Aufbau haben
hiermal nur schemanhaft skizziert
main() {
HashMap<String String> map = new HashMap<String, String>;
String content = "Dieser {{ key1 }} soll ersetzt {{key2 }}";
map.set('key1', 'Text');
map.set('key2', 'werden');
System.out.print( func(content, map, '{{', '}}') ); // Output: Dieser Text soll ersetzt werden
}
func(String content, HashMap<String, String> map, String startTag, String endTag) {
// .....
}
Hierzu mal 2 Fragen
ich erhalte wenn ich die Funktion so schreibe bei HashMap<String, String> von meiner IDE die Meldung ‘type HashMap does not take parameter’. Wie müsste ich HashMap als Übergabeparameter korrekt schreiben
Gibt es evtl. schon eine vorgefertige Funktion aus irgendeiner Lib, die soetwas kann? Die Leerzeichen innerhalb des startTag und endTag sollen hierbei überlesen werden. Deshalb habe ich auch bewusste oben in content “{{key2 }}” geschrieben.
Sicher das du die richtige HashMap importiert hast:
java.util.*
Auch ist es besser wenn du gegen interfaces implementierst. Also Map<String, String> map = new HashMap<String,String>();
So kannst du ggf. die Implementierung der HashMap mit einer anderen Map austauschen ohne Code zu ändern.
In java heißen Functionen methoden und sind eigentlich keine functionen.
public void foo(Map<String,String> x, String key, String value){}
Frage: 2
String hat mehrere helper funktionen mit dem man das machen kann.
Stichworte sind String::indexOf, String::substring und String::length
Mit indexOf kannst du den index von deinem Key ermitteln und mit substring diesen rausholen.
Eine etwas andere Möglichkeit wäre mit Regex zu arbeiten. Dazu einfach mal google bemühen.
[QUOTE=Prototype]
String hat mehrere helper funktionen mit dem man das machen kann.
Stichworte sind String::indexOf, String::substring und String::length
Mit indexOf kannst du den index von deinem Key ermitteln und mit substring diesen rausholen.
Eine etwas andere Möglichkeit wäre mit Regex zu arbeiten. Dazu einfach mal google bemühen.[/QUOTE]
Erstmal danke, ja die Funktionen sind mir schon bekannt. Mit RegEx tue ich mich etwas schwer. Google habe ich bemüht um herauszufinden ob es eine besagte Methode schon existiert. Leider habe ich nichts gefunden.
Ich meinte allerdings mit Punkt 2 ob so eine Funktion schon irgendwo existiert. Ich hätte jetzt gedacht das so eine (wie ich glaube doch recht interssante Funktion) schon öfters existiert. Denkt man da z.B. an Templating. Sprich du hast einen Text der bestimmte Position, gekennzeichnet durch start und end Tag durch den Wert aus einer Hashmap ersetzten soll.
es gibt große Dinge die existieren wie ein Swing-Framework oder auch Listen mit Sortierung, und es gibt ganz kleine klare Dinge wie subString im String,
replaceAll() auch schon gesehen?
deins liegt in der Mitte und ist in seiner Gesamtheit viel zu variabel:
nur Keys oder auch Tags dazu, die Keys in einer Map oder sonstigen Datenstruktur geliefert, Leerzeichen beachten oder nicht,
sowas kann fast unmöglich fertig vorliegen, alle Möglichkeiten anzubieten wäre unlesbar,
genau deine gewünschte Variante ein seltener Zufall der fast niemanden sonst nützen würde,
hat in der API nix zu suchen,
gleichzeitig liegt das ideal in dem Bereich, den man selber schnell aus den Grundbausteinen zusammenprogrammieren kann, alles super
RegEx bildet ein Regelwerk mit dem man das schaffen kann, oder mit subString, trim & Co. handwerken, auch nicht schlecht
public static void main(String[] args) {
String st = "Dieser {{key1 }} soll ersetzt {{key2 }}";
String leer = "\\s*";
String begin = "\\{\\{" + leer;
String end = leer + "\\}\\}";
st = st.replaceAll(begin + "key1" + end, "Text");
System.out.println(st);
}
}
netter kleiner Punkt wie auch Arrays.binarySearch() nicht gut funktioniert wenn ein nicht sortiertes Array übergeben wird,
aber wo ist hier der Anlass dazu?
ist doch sonnenklar, dass davon ausgegangen wird, dass sich Keys im Text, nicht umsonst extra mit {{ }}, klar von Values unterscheiden,
wenn der Anwender der Methode falsches übergibt, dann selber schuld,
Doku muss vielleicht noch geschrieben werden, richtig, aber solche Anekdoten von echten Probleme doch besser unterscheiden
ist auch keine Frage, außer die Antwort die man sich denken kann: soll nicht vorkommen,
deswegen von der super geeigneten Map auf komplizierte Liste Key,Value zu wechseln wäre unschön,
LinkedHashMap muss auch nicht sein, auch noch zu kompliziert, leider kein Interface (LinkedMap) vorhanden
edit: „Sorry, ist nicht wichtig“ im so langen Posting-Text irgendwie halb überlesen, dennoch