Double Werte aus String filtern in Java?
Moin, ich sitze an einem Programm, bei dem ich von einer website einen langen string mit vielen Werten zugeschickt bekomme, die sich bei jeder Aktualisierung verändern. Nun muss ich jede einzelne Zahl dort rausfiltern um diese in einem array abzuspeichern. Das einlesen der strings erfolgt über einen scanner und bis dahin funktioniert es auch.
4 Antworten
Da du von einem Scanner schreibst, gehe ich davon aus, dass du nicht mit JavaScript, sondern mit Java arbeitest.
Dein Response entspricht wohl dem JSON-Format.
{
"AED": 4.201811,
"AFN": 109.023911,
"ALL": 121.358177,
/* ... */
}
Das heißt, man könnte zum Lesen eine Bibliothek wie gson einsetzen.
Mit einem Scanner-Objekt kannst du den String aber ebenso parsen. Unter der Annahme, dass keiner der Keys eine Zahl oder einen Punkt enthält, wäre dies eine Lösung:
String responseText = // ...
Scanner reader = new Scanner(responseText);
reader.useDelimiter("[^0-9.]+");
while (reader.hasNextDouble()) {
System.out.println(reader.nextDouble());
}
Es werden einfach alle nichtnumerischen Zeichen (sowie der Punkt) als Trennzeichen verwendet.
Noch eine andere Option wäre es, den String anhand von Trennzeichen zu zerlegen. Konkret wären das der Doppelpunkt und das Komma.
String[] entries = responseText.split("[,:]");
Über das Ergebnisarray müsste man nachfolgend iterieren und je Eintrag prüfen, ob er sich zu einem Dezimalwert parsen lässt.
try {
double number = Double.parseDouble(entry);
// ...
}
catch (NumberFormatException ex) {
}
Zur Erklärung: Der an split übergebene String entspricht (einmal wieder) einem regulären Ausdruck. Im oberen Fall wird also eine Zeichengruppe definiert, jedes Zeichen darin wird als Trenner gewertet.
Oh ja stimmt java und nicht JavaScript. Die ausgabe ist nur mit einem split so. Ich kann aber mal ein bisschen mit deinen Lösungsansätzen rumprobieren aber das ist fürs erste sehr hilfreich.
Arbeite doch mit RegEx und mach ein Match auf alle Werte, die du haben willst. Die Matches wären dann in einem Array zurückgegeben
Klingt nach einer perfekten Aufgabe für RegEx. Schau mal hier:
wenn wir wenigstens eine vorlage hätten
könnte man mit einem RegEx machen der dann die werte in ein Array packt . oder oder oder .
Der String den ich bekomme sieht so aus: „“rates“:{„AED“:4.201811,“AFN“:109.023911,“ALL“:121.358177,.........“ und in dem Stil noch rund 100 weitere
https://jsfiddle.net/4s8wbuph/
<div id="eingabe">
{„AED“:4.201811,“AFN“:109.023911,“ALL“:121.358177,.........“}
</div>
<div id="ausgabe">
</div>
let inp = document.getElementById("eingabe").innerHTML;
let result = inp.match(/[0-9]+\.[0-9]+/g);
document.getElementById("ausgabe").innerHTML = result.join("<br>");
hier regex
setzt es dann voraus dass sich die eingabe nicht verändern darf? Die eingabe ändert sich nämlich bei jedem start
lol , probier das doch einfach mal aus . es findet
zahlen.zahlen
nach dem muster .
hab dir sogar die doku verlinkt , also lernen musste schon selber .
Da muss ich mich wohl nochmal schlau lesen. Bevor ich das mache... gibt es eine Möglichkeit 2 strings miteinander zu vergleichen und alle Differenzen auszusortieren und alles was identisch ist stehen zu lassen? Dies wär glaub ich die eleganteste lösung via splits wenn das möglich ist.
das vereinfacht es nicht wirklich , den in jedem fall musst du dein zeug irgendwie in arrays stopfen .
das wird meinen lehrer vermutlich nicht stören. Habe die normalen aufgaben zu schnell erledigt dass ich als einziger diese aufgabe ohne erklärung bekommen habe. Da sind ein paar arrays eine üblichere variante bei meinem wissen
also dann tu einfach :) texte verlgeichen bringt jedenfalls nix . den das ist aufwand der eher zu problemen führt . das ist ein computer programm und nicht ein gehirn .
ergo , du machst ein array aus deiner CSV oder JSON string und dann noch ein Array und vegleichst . Deine Aufgabenstellung die du hier aber gefragt hast ist und bleibt , doubles filtern . Alles andere ist eine andere Frage . Da solltest Du aber erstmal Code liefern . viel spass .
mit regex kannst du auch noch mehr anfragen , also mal lernen
z.b. könntest du auch die Kürzel gleich mit abfragen und in ein 2 dimensionales array alles packen , also tabelle . dann weisste auch welche werte sich wo ändern , ggf 3 dimensionen nehmen .
Bisher habe ich splits bei : und bei , gesetzt... somit habe ich 2 arrays in denen die selben zahlen stehen aber der Rest ist unterschiedlich. Könnte ich also alles ungleiche rausfiltern hätte ich eine array nur mit den zahlen, welche ich dann in einen double umformen kann. Der rest wäre dann einfacher.
Der split hat mir extrem geholfen. Ich habe vorher alles versucht , und : gleichzeitig als split zu nutzen.